2013-09-24 57 views
1

我试图返回一个关系属性(称为proportion)加上在Neo4j中由Cypher查询匹配的所有关系的属性总和。这一步我已经得到了:Neo4j密码查询返回关系属性和所有匹配关系属性的总和

START alice=node(3) 
MATCH p=(alice)<-[r:SUPPORTED_BY]-(n) 
RETURN reduce(total=0, rel in relationships(p): total + rel.proportion), sum(r.proportion) AS total; 

这将返回:

+-----------------+ 
| reduced | total | 
+-----------------+ 
| 2  | 2  | 
| 1  | 1  | 
+-----------------+ 

,我期待:

+-----------------+ 
| reduced | total | 
+-----------------+ 
| 2  | 3  | 
| 1  | 3  | 
+-----------------+ 

作为暗号的初学者设计的,我真的不知道怎么样接近这个查询;我显然没有正确使用reduce。任何意见,将不胜感激。

回答

7

您需要使用WITH将查询分成两个部分:

  1. 找到所有比例的总和,并通过作为绑定名称下一部分
  2. 找到个体比例

START alice=node(3) 
MATCH alice<-[r:SUPPORTED_BY]-() 
WITH sum(r.proportion) AS total 
MATCH alice<-[r:SUPPORTED_BY]-(other) 
RETURN other.name, r.proportion, total 
+2

作为一个解释,你原来的查询的问题是,sum()总是执行一个聚合(即groupBy),在你的情况是第一列。 – PhilBa

+2

+1 Reduce主要用于可变长度路径或集合 - 如果您已经获得了不同“中间结果”或“行”中的值,则可以使用标准聚合函数,如下所示。 –