gpt4 book ai didi

neo4j - Cypher:没有循环的所有路径

转载 作者:行者123 更新时间:2023-12-04 00:06:43 26 4
gpt4 key购买 nike

我很难在没有循环的情况下获取到节点之间的所有可能路径。我使用neo4j 3.0.4。我准备了一个例子,但首先是一个简短的解释。我有从 A 到 Z 的节点。这些节点可以以各种方式连接。我想获得所有可能的路径而没有循环,这意味着不会多次访问特定节点。

这里是例子:

CREATE (newNode {name:'A'})
RETURN newNode;

CREATE (newNode {name:'B'})
RETURN newNode;

CREATE (newNode {name:'C'})
RETURN newNode;

CREATE (newNode {name:'D'})
RETURN newNode;

CREATE (newNode {name:'E'})
RETURN newNode;

CREATE (newNode {name:'Z'})
RETURN newNode;


MATCH (n1), (n2)
WHERE n1.name = 'A' AND n2.name = 'B'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'A' AND n2.name = 'C'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'B' AND n2.name = 'C'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'C' AND n2.name = 'D'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'D' AND n2.name = 'E'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'E' AND n2.name = 'Z'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'D' AND n2.name = 'Z'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'D' AND n2.name = 'A'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;

MATCH (n1), (n2)
WHERE n1.name = 'B' AND n2.name = 'A'
CREATE
(n1)-[r:CONNECTED_TO]->(n2)
RETURN n1, n2, r;


MATCH p=(from{name:'A'}), (to{name:'Z'}),
path = (from)-[r*]->(to)
RETURN path

如果我运行最后一个查询,我还会得到像 A->B->A->C->D->Z 这样的路径。我想避免这个循环A->B->A。allShortestPaths 对我不起作用,因为它只会提供跳数最少的路径。但我想获得所有没有循环的路径,跳数无关紧要。有必要限制结果或路径长度,因为查询非常昂贵。

path = (from)-[r*20]->(to)

但这不是避免循环的解决方案,因为它们也可能发生在短路径中。

编辑1:好的,现在我想出了一个可能的解决方案:

MATCH (from{name:'A'}), (to{name:'Z'}), 
path = (from)-[:CONNECTED_TO*]->(to)
WHERE NONE (n IN NODES(path) WHERE SIZE(FILTER(x IN NODES(path) WHERE n = x))> 1)
RETURN path, LENGTH(path) as length
ORDER BY length;

这个查询似乎有效,但我认为它非常昂贵。有人可以提供更好的解决方案吗?

最佳答案

如果你把它改成这样,你的过滤器会更快地失败:

WHERE ALL(x IN NODES(path) WHERE SINGLE(y IN NODES(path) WHERE y = x))

但我不相信你会找到一种从根本上更有效的方法。通常,当您的问题包含“所有路径”一词并且您的样本具有无限关系时,您的选择非常有限:)

关于neo4j - Cypher:没有循环的所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40060000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com