我有多个传入&节点的传出关系(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
答案 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。然后你得到了相关的总和。