2015-09-15 108 views
2

也许我需要花更多的时间与Cypher支架的文件,但具有下列CYPHER查询:邻居,重复和聚集与Cypher支架和Neo4j的

MATCH (a)-[:friends|colleagues]-(b) 
WHERE 'Boston' IN a.lived_in and 'Boston' IN b.lived_in 
WITH a, count(b) as c 
RETURN a.name, c 

为什么b包含重复?

回答

2

[:friends|colleagues]的意思是“找到所有的friendcolleague关系”。

因为节点a可以是另一个节点b的朋友和同事(反之亦然,因为您的查询是非定向的),所以查询可以为任何给定的节点对找到多个结果行。

当您通过a进行聚合(使用COUNT())时,默认情况下将在聚合中包含任何重复的b节点。

如果您只想计算不同的结果b,您可以使用DISTINCT关键字如下(我还通过删除不必要的WITH条款简化了查询):

MATCH (a)-[:friends|colleagues]-(b) 
WHERE 'Boston' IN a.lived_in AND 'Boston' IN b.lived_in 
RETURN a.name, COUNT(DISTINCT b) AS c; 
+0

谢谢,这更有意义现在。实际上,我使用WITH查询来筛选出重复项(在原始查询中),使用WITH collect(distinct b)作为b。任何更好的方式来做到这一点? – bsuire

+0

如果你想返回不同'b'节点的*集合*,那么你可以在我的查询中使用'COLLECT'而不是'COUNT'。不需要'WITH'。 – cybersam