Neo4j:Cypher查询返回重复结果

时间:2016-07-01 11:56:28

标签: neo4j cypher

我有两个这样构建的图表:

CREATE (level1a:Bug {name: 'a'})
CREATE (level1b:Bug {name: 'b'})
CREATE (level2c:Bug {name: 'c'})
CREATE (level2d:Bug {name: 'd'})
CREATE (level3e:Bug {name: 'e'})
CREATE (level3f:Bug {name: 'f'})
CREATE (level3g:Bug {name: 'g'})
CREATE (level3h:Bug {name: 'h'})

CREATE (level1a)-[:LINK]->(level2c)
CREATE (level1b)-[:LINK]->(level2d)
CREATE (level2c)-[:LINK]->(level3e)
CREATE (level2c)-[:LINK]->(level3f)
CREATE (level2d)-[:LINK]->(level3g)
CREATE (level2d)-[:LINK]->(level3h)

此处也可以:http://console.neo4j.org/?id=duplicate_bug2

执行查询时:

MATCH (a:Bug {name: 'a'})-[:LINK]->()-[:LINK]->(end) return end

我得到了预期的两个节点(f和e)。但如果我这样做两个匹配查询:

MATCH (a:Bug {name: 'a'})-[:LINK]->()-[:LINK]->(end)
MATCH (b:Bug {name: 'b'})-[:LINK]->()-[:LINK]->(end2)
return end, end2

我在end和end2中获得重复节点。为什么是这样?这两个图甚至没有连接!

BR, 小号

1 个答案:

答案 0 :(得分:0)

由于两个匹配都将返回多行,并且两个匹配语句之间没有相关性,因此它将生成两个结果集的叉积。在这种情况下,它是2x2,因此每个节点都有四行每个节点。

我认为你所追求的是这样的查询。它从第一个匹配中找到所有结尾,将它们组合在一个集合中,然后为第二个匹配重复该过程。然后它返回结果集中的一行,其中包含b的所有末尾和MATCH (a:Bug {name: 'a'})-[:LINK]->()-[:LINK]->(end) with collect(end) as end MATCH (b:Bug {name: 'b'})-[:LINK]->()-[:LINK]->(end2) return end, collect(end2) as end2 的所有末尾,而不管每次匹配结束时有多少。

.col-center {
  float: none;
  margin: 0 auto;
}

<div class="col-md-7 col-center">