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