2016-05-10 2 views
2

csvファイルからグラフを生成したい。行は頂点であり、列は属性です。 2つの頂点が同じ属性の値を持つとき、その2つの頂点が同じ属性を持ち、値が1またはtrueになるような方法で、頂点の類似度(必ずしもウェイトではない)によってエッジを生成したいとします。大きなグラフのためにNeo4Jでエッジを生成するスマートな方法

私に発生した最も簡単なCYPHERクエリはやや次のようになります。

Match (a:LABEL), (b:LABEL) 
WHERE a.attr = b.attr 
CREATE (a)-[r:SIMILAR {attr : 1}]->(b) 

グラフは、およそ148000頂点を持ち、Java Heap Sizeオプションがある:動的に利用可能なシステムリソースに基づいて算出しました。

私が投稿したクエリは、上記のJavaヒープスペースのヒントを持つNeo.DatabaseError.General.UnknownFailureを提供します。

私が考えることができる問題は、巨大なデカルト積がまずエッジを作成するためにマッチを探すように構築されていることです。よりスマートな、それを行う連続的な方法がありますか?

答えて

2

を返すまで反復ごとにSKIP値をインクリメントすることにより、クエリを実行することができます:いいえ特定の属性の値によってすべてのノードを相互に接続する必要があります。同じ値属性を持つノードをバインドする中間ノードを持つ方がよいでしょう。

これは、エクスポート時以降に行うことができます。例えば

Match (A:LABEL) Where A.attr Is Not Null 
Merge (S:Similar {propName: 'attr', propValue: A.attr}) 
Merge (A)-[r:Similar]->(S) 

後に別のクエリで一つだけの接続(この属性の同じ値を持つ他のノード)との類似ノードを削除することができます:あなたが必要な場合は

Match (S:Similar)<-[r]-() 
With S, count(r) As r Where r=1 
Detach Delete S 

すべての小道具で接続し、次のクエリを使用することができます:

Match (A:LABEL) Where A.attr Is Not Null 
With A, Keys(A) As keys 
    Unwind keys as key 
    Merge (S:Similar {propName: key, propValue: A[key]}) 
    Merge (A)-[:Similar]->(S) 
+0

完璧、ありがとう!二部グラフを作成します。それは事をもっと簡単にします。 – Wipster

+1

@Wipsterあなたの興味深い質問ありがとう:) –

1

あなたはhuuugeデカルト製品が生産されることは間違いありません。

あなたは、例えば1000のバッチでAノードを反復処理し、それは私はあなたがほとんど変化モデルが必要だと思う0

MATCH (a:Label) 
WITH a LIMIT SKIP 0 LIMIT 1000 
MATCH (b:Label) 
WHERE b.attr = a.attr AND id(b) > id(a) 
CREATE (a)-[:SIMILAR_TO {attr: 1}]->(b) 
RETURN count(*) as c 
関連する問題