Neo4J-Cypher:通过多个标签的多个节点的allShortestPaths

时间:2018-07-23 15:30:53

标签: neo4j cypher shortest-path

通过问题here和信息here,我可以针对自己的情况创建查询。但是,当我测试解决方案时,似乎多个标签的节点不会返回所需的输出。

比方说,基恩·里维斯(Keany Reeves)出演了《黑客帝国》,基努·里维斯(Keanu Reeves)认识克林特·伊斯特伍德(Clint Eastwood),克林特·伊斯特伍德(Clint Eastwood)认识休·杰克曼(Hugh Jackman)。在这种情况下,如果我要使用以下查询:

WITH ["Keanu Reeves", "Matrix", "Hugh Jackman"] AS names
UNWIND names AS nn
  MATCH (n {name: nn})
  WITH collect(n) AS nds

UNWIND nds AS n1
  UNWIND nds AS n2
  WITH nds, n1, n2 WHERE id(n1) > id(n2)
    MATCH path = allShortestPaths((n1)-[*]-(n2))
    WITH nds, path WHERE ALL(n IN nds WHERE n IN nodes(path))
RETURN path ORDER BY length(path) ASC;

所需的输出将是Keanu Reeves的一个节点,指向Matrix的一个节点。然后还指向基努·里夫斯的将是克林特·伊斯特伍德的节点。 Clint的节点将指向Hugh Jackman的节点。像这样:

(HJ)-KNOWS->(CE)-KNOWS->(KR)-ACTED_IN->(TM)

但是,我的当前输出不包含3个起始节点。我想我完全不了解双重放松。就像是double for循环,您可以在其中将其与按ID排序的下一项进行比较?

顺便说一句,在我的现实生活中,我使用id代替名称,但这在这种情况下并不重要。我用WHERE ID(bla)子句解决了这个问题。

0 个答案:

没有答案