Cypher Neo4j计数两个节点之间的双向关系,避免重复结果

时间:2017-05-31 08:58:10

标签: neo4j cypher

这是我的问题:

MATCH (a:Person)-[:Sent]->(m2:message)-[r:forward]->(m1:message)<-[Sent]-(b:Person)
   WITH a, b, COUNT(r) as count
   RETURN a,b,count

以下是结果示例:

  a             b            count
   name1         name2          2
   name2         name1          3

我想在两个方向上得到2个节点之间转发消息的总和,因此我不希望像上一个例子那样有重复的结果

对于前面的例子,我想要这样的结果:

 a             b            count
name1         name2          5

我尝试了很多查询,但无法找到任何解决方案或语法来获得此结果。

有没有办法获得这种结果? 提前感谢您的时间。

2 个答案:

答案 0 :(得分:1)

以下是获取每对适用人群之间转发邮件总数的方法:

MATCH (a:Person)-[:Sent]->(:message)-[r:forward]-(:message)<-[:Sent]-(b:Person)
WHERE ID(a) < ID(b)
RETURN a, b, COUNT(r) as count;

MATCH子句指定forward关系的非方向性模式,以便它匹配两个方向的关系。 WHERE子句确保您只为每对人获得一行结果。 此外,此查询会始终使用[:Sent],修复原始查询中的拼写错误。

答案 1 :(得分:0)

试一试:

MATCH (a:Person)-[:Sent]->(m2:message)-[r:forward]->(m1:message)<-[:Sent]-(b:Person)
WITH COLLECT(a) as rows, count(r) as count
RETURN {a:properties(rows[0]), b:properties(rows[1]), count: count}