Cypher sum属性来自&外向关系(Neo4j)

时间:2013-10-30 16:54:27

标签: neo4j cypher

我有多个传入&节点的传出关系(Neo4J)。

每个关系都有一个数字属性“weight”

我需要了解传入和传播之间的区别。节点的传出权重。

我尝试了这个查询,但两个总和都返回0,即使传入权重之和为20。

MATCH out=(n:Person)-[r:FRIEND]->(), in=(n:Person)<-[s:FRIEND]-() 
WHERE n.personid='12345' 
RETURN sum(r.fweight), sum(s.fweight);

另外,我试过这个......它崩溃/没有返回

MATCH (n:Person)-[r:FRIEND]->()  
MATCH (n:Person)<-[s:FRIEND]-()
WHERE n.personid='12345'
RETURN sum(r.fweight) , sum(s.fweight)

任何线索??? :d

2 个答案:

答案 0 :(得分:2)

这可能是因为“Return”中的属性名称“fweight”与实际用于关系“r”或“s”的“权重”不同。如果你改成它,它应该工作,

RETURN sum(r.weight), sum(s.weight)

但结果是包含许多重复r和重复s的所有元组(r,s)的总和。

要获得精确的总和,您可以获得不同的r和s的集合,然后对这样的集合求和,

RETURN reduce(sumr = 0, x in collect(distinct r)|sumr + x.weight) as sumr, reduce(sums = 0, x in collect(distinct s)|sums + x.weight) as sums

显示带有“r”和“s”属性的直接和的查询的控制台在这里,http://console.neo4j.org/?id=cqs2h7

显示带有集合的查询的控制台位于http://console.neo4j.org/?id=9st2mq

你会注意到虽然它们都返回了总和,但第一个查询的结果是“RETURN sum(r.weight),sum(s.weight)”包括重复的关系“r”和“s”而带有集合的第二个查询删除重复项并返回所需的总和。

答案 1 :(得分:0)

在这里的例子(console.neo4j.org/?id=cqs2h7),你得到的每一笔钱都是两次。

每个进出都是一个独特的组合,所以你得到的每一个都是对抗每一个,所有这些都是相加的。

如果您将RETURN更改为ID(r), ID(s), SUM(r.weight), SUM(s.weight),您将看到结果集包含每个ID的每个ID(r)。

你可以试试这个:

MATCH (n:Person)-[r:FRIEND]->() 
WHERE n.personid ='12345' 
WITH n, SUM(r.weight) AS sumR 
MATCH (n:Person)<-[s:FRIEND]-() 
RETURN sumR, SUM(s.weight)

现在你首先获得out rel的SUM。然后你得到了相关的总和。