2016-07-12 13 views
1

グラフは1Mノードです。データモデルは意図的に単純です。エンティティとIDTypeノードがあります。単一のEntityは1:多くのIDTypeノードを持つことができます。 IDTypeノードは、1:多くのエンティティに接続することができます。これにより、グラフが形成されます。Neo4jでノードをクラスタリングする方法

目的は、IDTypeとEntitiesのすべてのクラスタを、ノードのクラスタ(サブグラフと呼んでいます)と呼ぶものにまとめて検索することです。 1M個のノードがあるとします。私はグラフのデータでこのような "クラスタ"を探したいと思います、私はそれを行う方法を理解しようとしています。私はそれを行うと信じているサイファークエリを書いたが、それが意図されているかどうかは私には分からない。

質問:効率的にグラフをトラバースし、ノードをクラスタリングして、行ベースの結果セットとして返すことができる単一の行またはグループが、私のpythonドライバプログラムに戻って動作するようにするにはクラスタ。これは私の結果の正確な構造である必要はありませんが、これは私が探しているものの感覚です。

クラスタ|ノード 1 | 2,3,4,5,6,7- 2 | 10,11,12,13 3 | 15,17,19,20,21,25,27,28、 33

ここで、「クラスタ」とは、ノードリストの任意のクラスタリングです(単なるクラスタの集まりであるとか、すべてが関連していると言う別の方法の場合、私は金色です) 。 「ノード」番号は、すべてのエンティティノードにタグ付けする固有の整数ベースのプロパティを表します。

クエリは以下のとおりです。概念は、 "エンティティ"ノードが1つまたは複数の "ID"ノードを持つことができ、関係 "HAS_ID"を介して互いに関連するすべての "エンティティ"と "ID"を取得しようとしているということです。

概念的には、このEntity1ようなデータに存在する関係がある場合 - > ID1 < --Entity2 - > ID2 < --Entity3 - > ID3 < --Entity4 - > ID4 < - Entity5の場合、それらを一緒に「クラスタ化」して、このノードグループを表す一意の番号を作成することができます。私の例では、5つのエンティティがありますが、2つのエンティティまたは50のエンティティが互いに関連していることもあります。そのため、可変長パスが必要なものだと思っています。

以下はグラフでこれを行う私の試みです。しかし1)正しいですか? 2)無期限に実行されるように見えるので効率的です3)どのようにしてこれらをまとめてグループ化するのがベストですか?

match 
(n:Entity)-[e1:HAS_ID*]-(o) 
where n.key <> o.key 
return * 
limit 10 
; 

私も

match (n:Entity)-[e1:HAS_ID*]-(o) 
where n.key <> o.key 
with distinct n.key as key_1, o.key as key_2 
return key_1, collect(key_2) 
limit 100 
; 

を試してみたこのは、私が欲しいものに近い行うにようだが、私はまだ他の言葉で、与えられたキーのための単一のグループが届きません、私は5行を返すことができますが、それらはすべて関連しています。その場合、1行しか持たないでしょう...彼は例です。キー "49518"が1行目と2行目にあることがわかりますむしろそれらをすべて一緒にグループ化した1つの行があります。

49518 [49004, 49871, 49940, 50525, 49101, 49625, 50165, 50017, 49098, 50383] 
49940 [49088, 49706, 50292, 50470, 49140, 49258, 49216, 49559, 50004, 50346, 49237, 49518, 49894, 49101, 49625, 50165, 50017, 49098, 50383] 

答えて

0

あなたの質問は、あなたが説明した関係パターンと一致しません。

あなたのパターンであなたの矢のそれぞれである[:HAS_ID]関係、エンティティとIDが常にそれぞれの関係の間で交互にされているので、もし、その後、あなたの現在のクエリにのみ、このようなパターンにマッチします:

(:Entity)-[:HAS_ID]->(:ID)<-[:HAS_ID]-(:Entity)-[:HAS_ID]->(:ID)<-[:HAS_ID]-(:Entity) 

3エンティティ、2つのID、4つの関係。これは、5つのエンティティ、4つのID、8つのリレーションシップのサンプルパターンと一致しません。少なくとも、* 8を使用するようにパターンを変更したいと思うでしょう。

効率性について...あなたがしようとしていることは、すべてのシングルでこのパターンを見つけることを試みなければならないので、むしろ非効率的であるように見えます。グラフ全体が:Entityと:IDと:HAS_IDの同じパターンで作成されている場合、クエリはグラフ全体を1回ではなく複数回走査します。

あなたは重複した結果を得ようとしています。グラフ全体が、あなたの例のように蛇のような独立した5つのエンティティ/ 4のID/8の関係チェーンで構成されているとしても(エンティティがチェーンの終わりに1つのIDへのリンクを持つか、 2つのIDへのリンクを持つ中間で)、同じノードグループに対して2つの一致が得られます.1つはチェーンの一方の端から一致し、もう一方はもう一方の端と一致します。それは単純なケースです...私はあなたのグラフがこれよりもはるかに複雑かもしれないと思っています。全く同じノードグループで、多くの異なるパターンがさらに一致する可能性があります。パターンを使用する一意のパスは、ノードの一意のグループに一致しません。

少なくとも、パターンをマッチさせ、RETURN DISTINCT NODES(p)を使用してノードの固有のセットを適用したいと思うかもしれませんが、まだマッチングにかなりの時間がかかると思います。

+0

ご連絡いただきありがとうございます。私はまだ困惑しています;(私は私の問題の詳細をあまりにもうまく説明しているとは思わないので、上の質問に空白を記入してもらえるかどうか確認してください) – DAE

+0

私は質問を更新しました。 – DAE

+0

ああ、どれくらい小さいか大きいかにかかわらずグループ全体を探しているので、各グループはサブグラフから他のIDへの[:HAS_ID]接続を持たない完全なサブグラフでなければなりません。エンティティ?トリッキーな問題... – InverseFalcon

関連する問題