Neo4J与其他节点匹配时,两次返回节点

时间:2019-03-27 16:15:42

标签: neo4j cypher

我想从具有一个节点相同的两个关系中获取值(2组值),然后返回所有组。

我尝试过这段代码,但是对于只有一个结果的第一个集合,由于第二个集合具有两个结果,所以它会重复它。

MATCH (sti:SingleTaskInstance) <- [:CONTAINS] - (cti:CollaborativeTaskInstance {cti_id: "RD1CT"}) 
- [:CONTAINS] -> (cti2:CollaborativeTaskInstance) return sti, cti2

这是结果

enter image description here

我们看到 sti 是重复的,但它只能返回一个结果。

我也尝试过在不想复制的集合上使用collect(distinct sti),但仍然无法正常工作。任何建议都欢迎。

1 个答案:

答案 0 :(得分:1)

在Cypher中,您将获得结果行,具体取决于匹配模式的所有可能路径。在您的情况下,找到了两个与模式匹配的路径,但是它们都碰巧具有相同的sti节点,这就是为什么您看到它出现两次的原因。这是设计使然。结果不是隐式分组的,您需要使用聚合函数自己进行操作。

如果要在每个单独的sti节点上收集cti节点,则需要像以下这样进行collect():

MATCH (sti:SingleTaskInstance) <- [:CONTAINS] - (cti:CollaborativeTaskInstance {cti_id: "RD1CT"}) - [:CONTAINS] -> (cti2:CollaborativeTaskInstance)
RETURN sti, collect(DISTINCT cti2)

我们正在收集不同的cti2节点,以防多个cti节点可以到达一个cti2节点(否则它可能出现多次)。聚合时,非聚合变量变得不同,因此借助聚合,您将获得不同的sti节点。