密码如何获得每两个节点之间的关系以及与起始节点的距离?
cypher how get relation between every two node and the distance from start node?
我有一些节点和关系,例如 A -> B ->C -> D
;并且B->D
所以B C D是一个循环,现在我想得到所有关系和每个关系到节点A的距离;
我期待这样的结果:
{startNode: A, endNode: B, rel:FRIEND, distanceFromAtoEndnode: 1},
{startNode: B, endNode: C, rel:FRIEND, distanceFromAtoEndnode: 2},
{startNode: C, endNode: D, rel:FRIEND, distanceFromAtoEndnode: 3},
{startNode: B, endNode: D, rel:FRIEND, distanceFromAtoEndnode: 2}
还有我的密码:
match p=(n:Person {name:"A"})-[r*1..9]-(m:Person) return last(r) as rel,length(p) as distanceFromAtoEndnode
但这总能得到一件我不需要的东西:
{startNode: D, endNode: C, rel:FRIEND, distanceFromAtoEndnode: 3},
如果有像“8”这样的双循环,那么结果会更糟
如何写密码?
虽然很容易获得到端节点的距离,但您需要获得最后一个关系以及您想要的结果,这将很难(也许不可能?)仅使用 Cypher 即可获得,因为关系可能会被遍历多次取决于图形的连通性,并且由于相同的关系将作为不同长度的路径的最后关系出现。
如果你绝对需要这个,那么你可以使用 APOC path expander procedures 来确保每个关系只被遍历一次,所以你不会得到与结果相同的关系,而是不同的路径。
应该给你想要的结果的用法示例:
MATCH (n:Person {name:"A"})
CALL apoc.path.expandConfig(n, {uniqueness:'RELATIONSHIP_GLOBAL', minLevel:1, maxLevel:9, labelFilter:'>Person'}) YIELD path
WITH last(relationships(path)) as rel, length(path) as distanceFromAtoEndnode
RETURN rel {startNode:startNode(rel).name, endNode:endNode(rel).name, rel:type(rel)} as rel, distanceFromAtoEndnode
至于纯 Cypher 解决方案,您可能会在高度连接的图上挂起,因为 Cypher 的扩展试图找到所有可能的路径。但是给你。
查找所有连接节点的最短距离:
MATCH path=(:Person {name:"A"})-[*1..9]-(other:Person)
RETURN other, min(length(path)) as shortestDistance
并找到连接所有连接节点的所有关系:
MATCH path=(:Person {name:"A"})-[*1..9]-(:Person)
WITH distinct last(relationships(path)) as rel
RETURN rel {startNode:startNode(rel).name, endNode:endNode(rel).name, rel:type(rel)} as rel
我有一些节点和关系,例如 A -> B ->C -> D
;并且B->D
所以B C D是一个循环,现在我想得到所有关系和每个关系到节点A的距离;
我期待这样的结果:
{startNode: A, endNode: B, rel:FRIEND, distanceFromAtoEndnode: 1},
{startNode: B, endNode: C, rel:FRIEND, distanceFromAtoEndnode: 2},
{startNode: C, endNode: D, rel:FRIEND, distanceFromAtoEndnode: 3},
{startNode: B, endNode: D, rel:FRIEND, distanceFromAtoEndnode: 2}
还有我的密码:
match p=(n:Person {name:"A"})-[r*1..9]-(m:Person) return last(r) as rel,length(p) as distanceFromAtoEndnode
但这总能得到一件我不需要的东西:
{startNode: D, endNode: C, rel:FRIEND, distanceFromAtoEndnode: 3},
如果有像“8”这样的双循环,那么结果会更糟
如何写密码?
虽然很容易获得到端节点的距离,但您需要获得最后一个关系以及您想要的结果,这将很难(也许不可能?)仅使用 Cypher 即可获得,因为关系可能会被遍历多次取决于图形的连通性,并且由于相同的关系将作为不同长度的路径的最后关系出现。
如果你绝对需要这个,那么你可以使用 APOC path expander procedures 来确保每个关系只被遍历一次,所以你不会得到与结果相同的关系,而是不同的路径。
应该给你想要的结果的用法示例:
MATCH (n:Person {name:"A"})
CALL apoc.path.expandConfig(n, {uniqueness:'RELATIONSHIP_GLOBAL', minLevel:1, maxLevel:9, labelFilter:'>Person'}) YIELD path
WITH last(relationships(path)) as rel, length(path) as distanceFromAtoEndnode
RETURN rel {startNode:startNode(rel).name, endNode:endNode(rel).name, rel:type(rel)} as rel, distanceFromAtoEndnode
至于纯 Cypher 解决方案,您可能会在高度连接的图上挂起,因为 Cypher 的扩展试图找到所有可能的路径。但是给你。
查找所有连接节点的最短距离:
MATCH path=(:Person {name:"A"})-[*1..9]-(other:Person)
RETURN other, min(length(path)) as shortestDistance
并找到连接所有连接节点的所有关系:
MATCH path=(:Person {name:"A"})-[*1..9]-(:Person)
WITH distinct last(relationships(path)) as rel
RETURN rel {startNode:startNode(rel).name, endNode:endNode(rel).name, rel:type(rel)} as rel