我有一个补丁,其中我知道一个起始节点和结束节点,其中两个节点之间的节点数量未知。我希望收集节点的集合以及链中每个退出节点的关系。
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
的类型为Set
或Read
,这会大大减少扫描量,但认为不存在一种查询方式。
有什么方法可以对此进行优化?
答案 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