Neo4j聚合/连接节点的数量

时间:2012-10-04 05:17:11

标签: neo4j cypher

我正在尝试计算连接到节点A的节点,其中节点A是从节点B开始的Cypher查询的一部分,我得到了意想不到的结果。这是一个示例设置。假装我们正在看书籍和所有者,书籍引用其他书籍,而业主当然拥有书籍:

Book B1
Book B2 CITES B1
Book B3 CITES B1
Book B4
Owner O1 OWNS B1
Owner O2 OWNS B2
Owner O3 OWNS B3 and B4

所以,让我说我正在看书B1,我想找到每本引用它的书,然后计算每个拥有引用书籍的人拥有的书籍。因此,如果我从B1开始,我应该找到所有者O2和O3,因为每个人都拥有一本引用B1的书。如果我统计他们拥有的书籍,我应该为O2获得1,为O3获得2。

首先,只列出所有者的查询工作正常:

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c return c.name

按预期返回名称。但接下来是这个问题:

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c-[:OWNS]->d return c.name, count(d)

似乎它应该到达c,这是所有者列表,然后通过OWNS关系将所拥有的书籍作为d,并计算它们。但我得到了:

+--------------------+
| c.name  | count(d) |
+--------------------+
| "O3"    | 1        |
+--------------------+

感觉它正在遗漏已经通过其他OWNS链接找到的书籍/节点 - 由b代表的那些。有没有办法在单个查询中执行此操作,或者最好是将所有者收集为c,然后再次查询每个查询?感觉这应该是可能的,但我还没想到它。任何想法都会很棒 - 提前谢谢。

1 个答案:

答案 0 :(得分:0)

你是对的,一旦找到一个节点,你就无法在另一个命名变量下的同一场比赛中再次找到它。您可以使用WITH解决此问题,然后以相同的方式使用d,它将匹配所有这些内容。

START a=node(14) 
MATCH a<-[:CITES]-b<-[:OWNS]-c 
WITH c MATCH c-[:OWNS]->d 
RETURN c.name, count(d);

http://console.neo4j.org/?id=x1jst9