标签订单效果搜索时间?

Evg*_*gen 6 neo4j cypher

我正在使用neo4j 2.1.7最近我正在尝试使用Match查询,搜索带有多个标签的节点.我发现,通常是查询

Match (p:A:B) return count(p) as number
Run Code Online (Sandbox Code Playgroud)

Match (p:B:A) return count(p) as number
Run Code Online (Sandbox Code Playgroud)

工作时间不同,非常适用于例如2百万个节点A和0个节点B的情况.那么标签订单效果搜索时间是多少?这个未来是否记录在何处?

Ste*_*ter 9

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

在做查询时

MATCH (n:A:B) return count(n)
Run Code Online (Sandbox Code Playgroud)

labelscanstore用于查找所有A节点,如果这些节点也带有标签B,则会对它们进行过滤.如果n(A) >> n(B)这样做更有效率,MATCH (n:B:A)因为你只查找几个B节点并过滤那些节点.

您可以使用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));
Run Code Online (Sandbox Code Playgroud)

我们现在有100个B节点,1M个A节点和1个AB节点.在2.2中这两个陈述:

MATCH (n:B:A) return count(n)
MATCH (n:A:B) return count(n)
Run Code Online (Sandbox Code Playgroud)

导致完全相同的查询计划(因此执行速度相同):

+------------------+---------------+------+--------+-------------+---------------+
|         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 |
+------------------+---------------+------+--------+-------------+---------------+
Run Code Online (Sandbox Code Playgroud)

由于只有很少的B节点,因此扫描B和过滤器会更便宜A.Smart Cypher,不是吗;-)