3

このグラフでは、共通の関心ごとにユーザーを比較しようとしています。
次のクエリが重複したペアを生成する理由はわかっていますが、それを回避するための良い方法は思いつきません。サイファーでループせずにそれを行う方法はありますか?

neo4j-sh (?)$ start n=node(*) match p=n-[:LIKES]->item<-[:LIKES]-other where n <> other return n.name,other.name,collect(item.name) as common, count(*) as freq order by freq desc;
==> +-----------------------------------------------+
==> | n.name | other.name | common           | freq |
==> +-----------------------------------------------+
==> | "u1"   | "u2"       | ["f1","f2","f3"] | 3    |
==> | "u2"   | "u1"       | ["f1","f2","f3"] | 3    |
==> | "u1"   | "u3"       | ["f1","f2"]      | 2    |
==> | "u3"   | "u2"       | ["f1","f2"]      | 2    |
==> | "u2"   | "u3"       | ["f1","f2"]      | 2    |
==> | "u3"   | "u1"       | ["f1","f2"]      | 2    |
==> | "u4"   | "u3"       | ["f1"]           | 1    |
==> | "u4"   | "u2"       | ["f1"]           | 1    |
==> | "u4"   | "u1"       | ["f1"]           | 1    |
==> | "u2"   | "u4"       | ["f1"]           | 1    |
==> | "u1"   | "u4"       | ["f1"]           | 1    |
==> | "u3"   | "u4"       | ["f1"]           | 1    |
==> +-----------------------------------------------+ 
4

2 に答える 2

13

a--bとの形式での重複を避けるためにb--a、WHERE 句で組み合わせの 1 つを除外できます。

WHERE ID(a) < ID(b)

上記のクエリを作成する

start n=node(*) match p=n-[:LIKES]->item<-[:LIKES]-other where ID(n) < ID(other) return n.name,other.name,collect(item.name) as common, count(*) as freq order by freq desc;
于 2013-06-18T10:38:50.967 に答える
0

OK、(*) を開始点として使用していることがわかります。これは、グラフ全体をループし、各ノードを開始点にすることを意味します..したがって、出力は異なり、あなたが言うように重複しません..

+-----------------------------------------------+
| n.name | other.name | common           | freq |
+-----------------------------------------------+
| "u2"   | "u1"       | ["f1","f2","f3"] | 3    |

等しくない:

+-----------------------------------------------+
| n.name | other.name | common           | freq |
+-----------------------------------------------+
| "u1"   | "u2"       | ["f1","f2","f3"] | 3    |

したがって、インデックスを使用して開始点を設定すると、重複が発生しないことがわかります。

start n=node:someIndex(name='C') match p=n-[:LIKES]->item<-[:LIKES]-other where n <> other return n.name,other.name,collect(item.name) as common, count(*) as freq order by freq desc;
于 2013-06-16T08:07:07.007 に答える