Neo4j更高效的Cypher查询,用于查找具有关系的连接节点

时间:2018-08-10 11:08:01

标签: neo4j cypher query-optimization

我有一个补丁,其中我知道一个起始节点和结束节点,其中两个节点之间的节点数量未知。我希望收集节点的集合以及链中每个退出节点的关系。

PROFILE MATCH p = (:Question{id:'1234'})-[:Answer*0..3]->(t)-
[:Answer]->(:Question{id:'5678'})
WHERE t:Set OR t:Read
OPTIONAL MATCH (x)-[v:Answer]->(y)
WHERE x.id <> '1234' and x IN nodes(p) AND v IN rels(p)
return x,v

此查询的效率非常低,因为OPTIONAL MATCH (x)-[v:Answer]->(y)需要进行完整的节点扫描。

我知道t的结果是x的类型为SetRead,这会大大减少扫描量,但认为不存在一种查询方式。

有什么方法可以对此进行优化?

1 个答案:

答案 0 :(得分:1)

您可以简单地展开已经拥有的路径:

MATCH p = (:Question{id:'1234'})-[:Answer*0..3]->(t)-[:Answer]->(:Question{id:'5678'})
WHERE t:Set OR t:Read
WITH nodes(p) AS nds, 
     rels(p) AS rls
UNWIND range(1, length(nds)-2) AS i
RETURN nds[i] AS x, 
       rls[i] AS v