0

我有一些节点和关系,例如A -> B ->C -> D;所以B->DBCD是一个循环,现在我想从节点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”这样的双循环,那么结果会更糟

我怎样才能写密码?

4

1 回答 1

3

虽然很容易获得到终端节点的距离,但您获得最后一个关系以及您想要的结果的要求将很难(也许不可能?)仅使用 Cypher,因为关系可能会被遍历多次,具体取决于图的连通性,并且由于相同的关系将作为不同长度路径的最后一个关系出现。

如果您绝对需要这个,那么您可以使用APOC 路径扩展程序来确保每个关系只遍历一次,因此您不会得到相同的关系,而是获得不同的路径。

一个应该给你想要的结果的用法示例:

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
于 2018-03-14T11:40:25.403 回答