Neo4j已连接节点的聚合/计数

Neo4j已连接节点的聚合/计数,neo4j,cypher,Neo4j,Cypher,我试图对连接到节点a的节点进行计数,其中节点a是从节点B开始的密码查询的一部分,我得到了意外的结果。下面是一个示例设置。假设我们看到的是书籍和所有者,书籍引用了其他书籍,而所有者当然拥有书籍: 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书,我想找到每一本引用它的书,然后数一数每一个拥有引用书的人所拥有的书。所

我试图对连接到节点a的节点进行计数,其中节点a是从节点B开始的密码查询的一部分,我得到了意外的结果。下面是一个示例设置。假设我们看到的是书籍和所有者,书籍引用了其他书籍,而所有者当然拥有书籍:

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的书。如果我数他们拥有的书,我应该得到1的氧气和2的臭氧

因此,首先,只列出所有者的查询很好:

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

感觉上它忽略了已经通过other OWNS链接找到的书籍/节点——由b表示的那些。是否有任何方法可以在单个查询中实现这一点,或者最好将所有者集合为c,然后为每个所有者再次查询?感觉这应该是可能的,但我还没弄明白。任何想法都很好——提前感谢。

没错,一旦找到一个节点,就无法在不同命名变量下的相同匹配中再次找到它。您可以使用带的
将其分解,然后以相同的方式使用
d
,它将匹配所有这些

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

比赛很有意义,非常感谢!但是,我仍然遇到一个问题:当我尝试该查询时,我得到一个错误,“SyntaxException:expected return子句”,其指示符位于with语句中。我运行的是neo4j社区服务器1.7,所以它是相当新的,但这可能是一个密码解析器版本问题吗?再次感谢。我回答了我自己的问题;事实上,我需要将我的服务器升级到1.8版,现在它可以完美地工作了。再次感谢!很高兴听到你找到了答案。:)
+--------------------+
| c.name  | count(d) |
+--------------------+
| "O3"    | 1        |
+--------------------+
START a=node(14) 
MATCH a<-[:CITES]-b<-[:OWNS]-c 
WITH c MATCH c-[:OWNS]->d 
RETURN c.name, count(d);