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

Neo4j用于查找具有关系的连接节点的更高效的密码查询,neo4j,cypher,query-optimization,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'

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

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
配置文件匹配p=(:问题{id:'1234})-[:答案*0..3]->(t)-
[:答案]->(:问题{id:'5678'})
其中t:Set或t:Read
可选匹配(x)-[v:答案]->(y)
其中x.id“1234”和x在节点(p)中,v在rels(p)中
返回x,v
此查询效率非常低,因为
可选匹配(x)-[v:Answer]->(y)
需要进行完整的节点扫描

我知道
t
,因此
x
将是
Set
Read
类型,这将大大减少扫描量,但我认为没有办法对此进行查询


有什么方法可以优化这一点吗?

您可以简单地解开您已经获得的路径:

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

看起来很棒!我假设range函数需要检查null,因为路径中可能没有节点?@Sheff,但为什么?节点数组和关系的长度已经知道了。@谢夫当然,你可以添加一个检查,检查一个节点数组的长度是否大于2。我明白你的意思了。问题是我查询的路径可能不存在(我在问题中没有提到),因此可能存在null
nds