gpt4 book ai didi

neo4j - 多标签节点的最优Neo4j索引策略

转载 作者:行者123 更新时间:2023-12-03 19:47:19 24 4
gpt4 key购买 nike

我使用 Neo4j 来表示我们的数据仓库。我们有大约 100,000 个不同类型的节点(大约 10 个),其中一些节点有多个标签。典型节点类型的一个子集是:

(:User)
(:Tableau:Workbook)
(:Tableau:Dashboard)

这里 Tableau代表数据可视化软件和 WorkbookDashboard是不同的 Tableau 实体。我们使用多个标签而不是一个唯一定义的标签的原因是我们可能想要匹配所有 (:Tableau)节点或所有 (:Dashboard)节点(我们有多个仪表板源)。

我还使用 GraphAware Neo4j UUID 库 ( https://github.com/graphaware/neo4j-uuid ) 来确保通过 uuid 唯一标识每个节点(无论类型如何)。节点属性。

我为每个节点标签创建了一个索引(和唯一性约束)以提高性能,即
CREATE INDEX ON:User(uuid)
CREATE INDEX ON:Tableau(uuid)
CREATE INDEX ON:Workbook(uuid)
CREATE INDEX ON:Dashboard(uuid)

鉴于 CREATE INDEX必须只带一个标签。

在给定此索引结构的情况下,使用 Cypher 匹配节点时,我遇到了一些性能问题。即使 (:Tableau:Dashboard) 的基数<< (:Tableau)以下查询是次优的
MATCH (n:Tableau:Dashboard) WHERE n.uuid = <UUID> 

与任何一个相比
MATCH (n:Tableau) WHERE n.uuid = <UUID> 
MATCH (n:Dashboard) WHERE n.uuid = <UUID>

鉴于前者不利用任何索引,而后者则这样做。如果您想仅根据 UUID(唯一的)在全局范围内查找节点,那么这个问题就会变得更加复杂,这在我们使用 Flask API 查找节点时经常出现,这会转化为以下 Cypher 逻辑:
MATCH(n) WHERE n.uuid = <UUID>

以下线程建议创建一个 Entity总体全局节点标签并在其上创建索引( Neo4j: Create index for nodes with same property ),
CREATE INDEX ON:Entity(uuid)

所以现在节点被标记如下,
(:Entity:User)
(:Entity:Tableau:Workbook)
(:Entity:Tableau:Dashboard)

这是最好的方法吗?另一个解决方案是,如果定义了多个标签,并且保证被索引,则只选择第一个标签,但是它不能解决仅基于 UUID 查找节点的问题。

如果我用 Entity label 方法保留所有先前定义的索引是否仍然有意义,即如果我只搜索节点的一小部分,我是否希望看到显着的性能改进?例如,如果我知道 n(:User)节点我应该期望看到类似的表现,
MATCH (n:Entity) WHERE n.uuid = <UUID>
MATCH (n:User) WHERE n.uuid = <UUID>

鉴于最佳 Cypher 查询可能更抽象,因此无法对无索引或多个索引进行索引是一种耻辱,即假设 (:Tableau:Workbook)填充 (:Tableau:Dashboard)然后找到工作簿填充的仪表板,人们将查询,
MATCH (s:Tabeau:Workbook)-[:POPULATES]->(t:Tableau:Dashboard)
WHERE s.uuid = <UUID>
RETURN t

这是相当透明的,但是从性能的角度来看,以下将是更优化的,尽管不太透明,因为用户不清楚什么类型的节点 s是,
MATCH (s:Entity)-[:POPULATES]->(t:Tableau:Dashboard)
WHERE s.uuid = <UUID>
RETURN t

最佳答案

您正在维护 Tableau 的重叠索引和 WorkbookTableauDashboard .为什么不只维护 Tableau 的索引消除冗余并向查询规划器抛出 USING INDEX 的提示以确保它在您的比赛中使用。即这样的事情......

MATCH (s:Tableau:Workbook)-[:POPULATES]->(t:Tableau:Dashboard)
USING INDEX s:Tableau(uuid)
WHERE s.uuid = <UUID>
RETURN t

关于neo4j - 多标签节点的最优Neo4j索引策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38944990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com