哪个Cypher查询计划更快?

时间:2014-05-12 16:54:59

标签: neo4j cypher

以下是两个不同的查询及其计划。查询结果完全相同,但请注意查询计划不同。

关键区别在于使用AllRelationships(identifier="r",...)TraversalMatcher(trail="(n)-[r WHERE true AND true]->(m)", ...)

问题:

  1. 一般来说哪一个更快?我的猜测是,迭代AllRelationships会比运行任何遍历更快,但我不知道。
  2. 这样的事情会成为优化的目标吗?在这种情况下,return不包含n子句中提到的mMATCH,这表明不需要遍历。
  3. 查询:

    neo4j-sh (?)$ profile start r=relationship(*) return count(r);
    +----------+
    | count(r) |
    +----------+
    | 100975   |
    +----------+
    1 row
    
    ColumnFilter(symKeys=["  INTERNAL_AGGREGATEdd639fdf-1939-4b9c-ba36-213a0e79fff5"], returnItemNames=["count(r)"], _rows=1, _db_hits=0)
    EagerAggregation(keys=[], aggregates=["(  INTERNAL_AGGREGATEdd639fdf-1939-4b9c-ba36-213a0e79fff5,Count(r))"], _rows=1, _db_hits=0)
      AllRelationships(identifier="r", _rows=100975, _db_hits=100975)
    neo4j-sh (?)$ profile match n-[r]->m return count(r);         
    +----------+
    | count(r) |
    +----------+
    | 100975   |
    +----------+
    1 row
    
    ColumnFilter(symKeys=["  INTERNAL_AGGREGATE961900f2-76e0-40a0-bcab-5e8db2683859"], returnItemNames=["count(r)"], _rows=1, _db_hits=0)
    EagerAggregation(keys=[], aggregates=["(  INTERNAL_AGGREGATE961900f2-76e0-40a0-bcab-5e8db2683859,Count(r))"], _rows=1, _db_hits=0)
      TraversalMatcher(trail="(n)-[r WHERE true AND true]->(m)", _rows=100975, _db_hits=301372)
    

1 个答案:

答案 0 :(得分:0)

我猜顶级查询更快,因为列出的db命中数更小。在底层查询中,我认为它正在迭代图中的所有节点。试试这个,如果你运行:

start n=nodes(*) return count(n);

我打赌你得到:301372