通过问题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)
子句解决了这个问题。