2017-02-16 6 views
0

私はNeo4jを初めて使用しています。私はソーシャルネットワークの視覚化プロジェクトに取り組んでいます。ルートノードのIDに基づいてすべての接続と関係(CONNECTED_TO)を取得したいので、データをループしてD3のデータ構造を構築できます。Cypher、重複なし、空の関係、空のノードなしで、指定されたラベルのすべてのノードと関係を取得

Current Schema Image

私は、ブラウザ内のクエリの多くで遊んでみました。現在のものはブラウザで正しい結果を返しますが、自動完了はオフですが、NodeJSで返された結果は重複して空の関係を返します。

MATCH p=(a:Connection)-[r:CONNECTED_TO]-(b:Connection)-[r2:CONNECTED_TO]-() 
WHERE id(a) = 1673 
RETURN [a, b] as nodes [r, r2] 

以下のステートメントは、WHERE句を持たないものを返します。 WHERE句が追加されると、パフォーマンスでもあるし、問題がで負担するので、それだけですべての関係

MATCH (a:Connection)-[r:CONNECTED_TO]-(b:Connection) 
RETURN [a, b] AS nodes, r AS relationship 

約200接続と2200体の関係を持つ媒体側のデータセットのないルートの接続およびその直接接続を返しますマインド。

ご協力いただければ幸いです。 InverseFalconによって提案

UPDATE

APOCパスの拡張手順が良好に動作します。可変長の関係を使用するのと比べて非常に効率的です。

ここで接続されたノードの各ペアリング結果のクエリ

MATCH (head:Connection) 
WHERE id(head) = 1673 
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO', uniqueness:'NODE_GLOBAL', bfs: true}) YIELD path 
WITH LAST(NODES(path)) as a 
MATCH (a)-[r:CONNECTED_TO]->(b) 
RETURN [a, b] as nodes, r as relationship 

答えて

0

は、それはあなたがユーザーのために、ネットワーク全体を検索するように聞こえるし、ネットワークでそれらのノードからのOUTPUT:CONNECTED_TO関係は。

variable-length relationshipsでMATCHを使用すると、すべてのパスが調査され、冗長な関係が構築され、十分に大きなネットワークで爆発する可能性があります。

APOCプロシージャには、サブグラフのすべてのノードをpath expansion procedureで展開する効率的な方法があります。ネットワーク内にすべての接続ノードがあれば、それらが接続されているノードを照合し、接続関係に沿って2つのノードを出力することができます。

また、空の関係の説明から、これらの関係のいずれかがプロパティを持つ場合はほとんど聞こえません。プロパティのないリレーションシップのテキスト出力は空のマップ{}ですが、コード自体にはリレーションIDと型データが用意されている必要があります。

リレーションシップのタイプを属性と共に明示的に戻したい場合は、map projectionを使用してリレーションシップのタイプを残りのアトリビュートとともに含めることができます。

フルクエリは次のようになります。

MATCH (head:Connection) 
WHERE id(head) = 1673 
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO>', uniqueness:'NODE_GLOBAL'}) YIELD path 
WITH LAST(NODES(path)) as a 
MATCH (a)-[r:CONNECTED_TO]->(b) 
RETURN [a, b] as nodes, r {TYPE(r), .*} as relationship 
+0

優秀な回答InverseFalconは、非常によく一緒に入れ。正しい方向に私を指してくれてありがとう。 APOC手順のいくつかは、私がこのプロジェクトのために計画している他の機能と本当にうまく機能します。 –

関連する問題