我想确定与认识特定人的邻居交谈持续时间的相对百分比。

例如,当首先观察节点 A 时,我们必须知道他花了多少时间与所有邻居交谈,这是通过以下查询执行的:

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 12418           |
==> +-----------------+
==> 1 row, 0 ms

接下来,我们必须检查他的哪些邻居认识特定的人(例如 c),并仅对 a 和 b 之间的对话持续时间求和,其中 b 认识 c:

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b)-[p:KNOWS]->(c) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 21013           |
==> +-----------------+
==> 1 row, 0 ms

这里似乎不合逻辑的是,第二个总和大于第一个总和,而第二个总和应该只是第一个总和的一部分。有谁知道获得这样的结果可能存在什么问题?15000 名用户中有 7 名出现了该错误。

有帮助吗?

解决方案

您并不是在该查询中查看特定的人 C。您将所有路径与任何 :KNOWS 关系相匹配,因此如果您有 a->b->c 和 a->b->d,则 a->b 之间的持续时间将被计算两次。

您可能需要做的是:

start a = node(351061), c=node(xxxxx) // set c explicitly
match (a)-[r:TALKED_TO]->(b)
where b-[:KNOWS]->c // putting this in the where clause forces you to set C
return sum(r.duration)

这是控制台中的示例:http://console.neo4j.org/r/irm0zy

请记住 match 扩大和 where 收紧结果。你也可以这样做 match, ,但是你需要在中指定c start.

测试聚合函数正在做什么的一个好方法是返回所有命名变量(或设置可以返回的路径)——这样您就可以看到聚合被分成小计。就像这样:

start a=node(1) 
match a-[r:TALKED_TO]->b-[:KNOWS]->c 
return sum(r.duration), a,b,c;
+-----------------------------------------------------------------------------------------------+
| sum(r.duration) | a                       | b                       | c                       |
+-----------------------------------------------------------------------------------------------+
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[4]{name:"person4"} |
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[3]{name:"person3"} |
| 20              | Node[1]{name:"person1"} | Node[5]{name:"person5"} | Node[6]{name:"person6"} |
+-----------------------------------------------------------------------------------------------+
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top