Neo4J寻找两个节点,使它们之间的最短路径长度为n

omqzjyyz  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(134)

我想知道是否有一种方法可以找到两个节点,使得它们之间的最短路径具有特定的长度,比如说10。
我所有的节点都有相同的标签;“n1”,并且最短路径可以通过任何边类型。
到目前为止,我一直在手动地做这件事,通过寻找节点n和节点m之间的最短路径,不断地改变n和m,当我找到一条长度为10的路径时停止。
下面是密码查询:
匹配sp =最短路径((起始节点)-[*]-〉(结束节点)),其中id(起始节点)= 1且id(结束节点)= 2返回sp
注意,我没有指定节点标签,因为我在图中只有一个标签。
所以我只是不断地改变开始和结束节点,然后运行它,直到找到一条所需长度的路径。
我相信有一个更简单的方法来做到这一点,但因为我是一个新的初学者,我很难弄清楚。
我也试过这个:

MATCH (n1), (n2)
WHERE n1 <> n2 and shortestPath((n1)-[*]-(n2)) = 5
RETURN n1, n2
LIMIT 2

然而,我不相信这是正确的,因为长度为5的最短路径在我的图中是很常见的,而且它需要很长的时间来执行...

smtd7mpg

smtd7mpg1#

[更新]
这个查询应该性能更高,它避免了使用cartesian product,对可变长度关系模式设置了上限,甚至不使用shortestpath

MATCH p=(n1)-[*10]->(n2)
WHERE n1 <> n2 AND NOT (n1)-[*..9]->(n2)
RETURN n1, n2
LIMIT 1
xa9qqrwz

xa9qqrwz2#

这对我很有效!

MATCH (n1), (n2)
WHERE n1 <> n2 and length(shortestPath((n1)-[*]->(n2))) = 10
RETURN n1, n2
LIMIT 1

相关问题