【发布时间】:2017-12-24 14:06:26
【问题描述】:
我对 Neo4j 的查询分析有一些疑问。 考虑以下简单的 Cypher 查询:
PROFILE
MATCH (n:Consumer {mobileNumber: "yyyyyyyyy"}),
(m:Consumer {mobileNumber: "xxxxxxxxxxx"})
WITH n,m
MATCH (n)-[r:HAS_CONTACT]->(m)
RETURN n,m,r;
输出是:
3.7.2.2。展开成
当开始和结束节点都已经找到时,展开到 用于查找两个节点之间的所有连接关系。
查询。
MATCH (p:Person { name: 'me' })-[:FRIENDS_WITH]->(fof)-->(p) RETURN > fof
所以在上面的查询中(在我的例子中),首先,它应该在找到任何关系之前找到 StartNode 和 EndNode。但不幸的是,它只是找到了 StartNode,然后将所有连接的:HAS_CONTACT 关系展开,这导致没有使用“Expand Into”运算符。为什么会这样?两个节点之间只有一个:HAS_CONTACT 关系。 :Consumer{mobileNumber} 存在唯一索引约束。为什么上面的查询会展开所有 7 个关系?
另一个问题是关于 Filter 运算符的:为什么它需要 12 db 命中,尽管所有节点/关系都已检索到?为什么这个操作只需要 6 行的 12 db 调用?
已编辑
我也测试了上述相同查询的不同版本,但返回相同的查询配置文件结果:
1
PROFILE
MATCH (n:Consumer{mobileNumber: "yyyyyyyyy"})
MATCH (m:Consumer{mobileNumber: "xxxxxxxxxxx"})
WITH n,m
MATCH (n)-[r:HAS_CONTACT]->(m)
RETURN n,m,r;
2
PROFILE
MATCH (n:Consumer{mobileNumber: "yyyyyyyyy"}), (m:Consumer{mobileNumber: "xxxxxxxxxxx"})
WITH n,m
MATCH (n)-[r:HAS_CONTACT]->(m)
RETURN n,m,r;
3
PROFILE
MATCH (n:Consumer{mobileNumber: "yyyyyyyyy"})
WITH n
MATCH (n)-[r:HAS_CONTACT]->(m:Consumer{mobileNumber: "xxxxxxxxxxx"})
RETURN n,m,r;
【问题讨论】:
-
您能在此处发布一些数据,以便我们更好地了解您的图表吗?这可能 - 这是基于经验的一点猜测 - 与查询规划器试图减少通过产生笛卡尔积(即,在第一个匹配子句中)产生的负载有关。您是否尝试过将查询的第一部分更改为使用两个
MATCH子句而不是一个带逗号的子句? -
@DomWeldon 请检查更新的问题