Neo4j 这些密码查询有什么区别?

Neo4j 这些密码查询有什么区别?,neo4j,cypher,Neo4j,Cypher,这些查询在逻辑上都是等价的,返回相同的6个结果(最后一个查询只返回5个结果除外),但性能差异很大,从31毫秒到45秒不等。我正在使用Neo4j 2.0.2。我在:SEGMENT(propertyId)上有一个索引,但是(n)的查找并不是查询速度慢的原因 match (n {productId:6122})<-[:PARENT_OF*]-(p) return n,p; [...] 6 rows 43879 ms match (n:SEGMENT {productId:6122})<-

这些查询在逻辑上都是等价的,返回相同的6个结果(最后一个查询只返回5个结果除外),但性能差异很大,从31毫秒到45秒不等。我正在使用Neo4j 2.0.2。我在:SEGMENT(propertyId)上有一个索引,但是(n)的查找并不是查询速度慢的原因

match (n {productId:6122})<-[:PARENT_OF*]-(p) return n,p;
[...]
6 rows
43879 ms

match (n:SEGMENT {productId:6122})<-[:PARENT_OF*]-(p) return n,p;
[...]
6 rows
44926 ms

start n=node(111426) match (n)<-[:PARENT_OF*]-(p) return n,p;
[...]
6 rows
31 ms

match (n {productId:6122}) match path=(n)<-[:PARENT_OF*]-(p) return path;
[...]
6 rows
694 ms

match (n:SEGMENT {productId:6122}) match path=(n)<-[:PARENT_OF*]-(p) return path;
[...]
6 rows
161 ms

match (n:SEGMENT)<-[:PARENT_OF*]-(p:SEGMENT) where n.productId=6122 return n,p;
[...]
5 rows
45332 ms

match(n{productId:6122})最快的查询是内部ID查找,这并不奇怪。ID值本身(避免将其作为外部标识符)与存储的数据结构紧密耦合。这大致相当于告诉Cypher节点在节点存储文件中的位置。(*)

对于接下来的两个最快的路径,我可能完全错了,但我认为它们更快,因为您只匹配了一个路径,尽管我不确定这到底是如何影响查询行为的。 这两个查询之间的小差异可以用以下事实来解释:不止一个查询在引擎盖下使用模式索引,而另一个查询没有(因为在第二种情况下没有指定标签)

对于最后3种情况,可能是起点位置查找时间与您与父母关系的深度相比非常不相关。我不确定,你可能会走很长的路


(*)我仍然不明白,仅仅通过开始节点的ID进行查找,如何解释与类似的两个最慢查询(它们也不通过路径匹配…)之间的差异。

尝试使用PROFILE关键字来比较执行计划。这里有一个例子:。第三个很快,因为使用了内部id。现在-这可能只是一个输入错误-但是您提到了“propertyId”上的索引,但是查询正在查找“productId”……是的,是一个输入错误。抢手货对于索引'match(n:SEGMENT{productId:6122}),使用内部id进行查找大约需要10毫秒。这与我在:SEGMENT(productId)上有正确的索引时一样。在没有索引的情况下,查找时间为750ms。感谢您提供有关配置文件的提示。看起来快速查询可以计算约48K条路径。慢的路径估计约为1.8M。
PROFILE match (n:SEGMENT {productId:6122})<-[:PARENT_OF*]-(p:SEGMENT) return n,p;
`ColumnFilter(symKeys=["n", "p", "  UNNAMED34"], returnItemNames=["n", "p"], _rows=5, _db_hits=0)
Filter(pred="(hasLabel(n:SEGMENT(0)) AND Property(n,productId(9)) == Literal(6122))", _rows=5, _db_hits=1895169)
  TraversalMatcher(start={"label": "SEGMENT", "producer": "NodeByLabel", "identifiers": ["p"]}, trail="(p)-[:PARENT_OF*1..]->(n)", _rows=1895169, _db_hits=1895169)`

PROFILE match (n {productId:6122}) match path=(n)<-[:PARENT_OF*]-(p) return path; 
`ColumnFilter(symKeys=["n", "p", "  UNNAMED41", "path"], returnItemNames=["path"], _rows=6, _db_hits=0)
ExtractPath(name="path", patterns=["ParsedVarLengthRelation(  UNNAMED41,Map(),ParsedEntity(n,n,Map(),List()),ParsedEntity(p,p,Map(),List()),List(PARENT_OF),INCOMING,false,None,None,None)"], _rows=6, _db_hits=0)
  PatternMatcher(g="(n)-['  UNNAMED41']-(p)", _rows=6, _db_hits=0)
    Filter(pred="Property(n,productId(9)) == Literal(6122)", _rows=1, _db_hits=48531)
      AllNodes(identifier="n", _db_hits=48531, _rows=48531, identifiers=["n"], producer="AllNodes")`