質問

特定の人を知っている隣人との会話期間の相対的な割合を決定したい。

ノードを最初に観察するときは、次のクエリで実行される隣人すべての隣人と話す時間を知っています。

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
.

次に、彼の隣人のどれが特定の人物を知っていて、AとBの間の会話の持続時間のみを確認しなければなりません。

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
.

ここで論理的なことは、2番目の合計が最初の合計よりも大きいほど最初は最初の部分になるはずです。誰かがそのような結果を得るために問題があるかもしれないものを知っていますか?エラーは15000のうち7人のユーザーに現れました。

役に立ちましたか?

解決

そのクエリの特定の人Cを見ていません。あなたはすべてのパスに任意のパスに一致しています。

あなたがおそらく何をする必要があるのは代わりに:

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/virmzy

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"} |
+-----------------------------------------------------------------------------------------------+
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top