我想确定与知道特定人的邻居的会话持续时间的相对百分比。
例如,当首先观察节点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个用户中。
答案 0 :(得分:2)
您没有在该查询中查看特定的人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
执行此操作,但需要在start
中指定c。
测试聚合函数正在做什么的一个好方法是返回所有命名变量(或设置一个可以返回的路径) - 这样你就可以看到聚合分为小计。像这样:
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"} |
+-----------------------------------------------------------------------------------------------+