gpt4 book ai didi

neo4j - 标签顺序会影响搜索时间吗?

转载 作者:行者123 更新时间:2023-12-04 14:11:59 25 4
gpt4 key购买 nike

我正在使用 neo4j 2.1.7 最近我正在试验匹配查询,搜索具有多个标签的节点。我发现,一般查询

Match (p:A:B) return count(p) as number


Match (p:B:A) return count(p) as number

在不同的时间工作,尤其是当您有 200 万个节点 A 和 0 个节点 B 时。
那么标签顺序会影响搜索时间吗?这个 future 在任何地方都有记录吗?

最佳答案

Neo4j 内部维护了一个标签扫描存储——这基本上是一个查找,以快速获取所有带有定义标签的节点 A .

当做这样的查询时

MATCH (n:A:B) return count(n)

labelscanstore 用于查找所有 A节点,然后如果这些节点带有标签 B 就会被过滤掉以及。如 n(A) >> n(B)这样做更有效率 MATCH (n:B:A)相反,因为你只查找了几个 B节点并为 A 过滤那些节点。

您可以使用 PROFILE MATCH (n:A:B) return count(n)查看查询计划。对于 Neo4j <= 2.1.x,您将看到不同的查询计划,具体取决于您指定的标签顺序。

从 Neo4j 2.2(撰写此回复时可用的里程碑 M03)开始,有一个基于成本的 Cypher 优化器。现在 Cypher 知道节点统计信息,它们用于优化查询。

例如,我使用以下语句来创建一些测试数据:
create (:A:B);
with 1 as a foreach (x in range(0,1000000) | create (:A));
with 1 as a foreach (x in range(0,100) | create (:B));

我们现在有 100 个 B 节点、1M 个 A 节点和 1 个 AB 节点。 2.2中的两个语句:
MATCH (n:B:A) return count(n)
MATCH (n:A:B) return count(n)

导致完全相同的查询计划(因此具有相同的执行速度):
+------------------+---------------+------+--------+-------------+---------------+
| Operator | EstimatedRows | Rows | DbHits | Identifiers | Other |
+------------------+---------------+------+--------+-------------+---------------+
| EagerAggregation | 3 | 1 | 0 | count(n) | |
| Filter | 12 | 1 | 12 | n | hasLabel(n:A) |
| NodeByLabelScan | 12 | 12 | 13 | n | :B |
+------------------+---------------+------+--------+-------------+---------------+

由于只有少数 B节点,扫描 B 并过滤 A 的成本更低.智能密码,不是吗;-)

关于neo4j - 标签顺序会影响搜索时间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28434138/

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