2017-01-24 2 views
1

次のようなグラフがあるとします。私はサブグラフで最大値を見つけたいと思いますし、サブグラフの最小値は違いをとって戻ります。Neo4j Cypher:切断されたすべてのサブグラフのノードの最大値と最小値を求めて差を取る

たとえば、右端のサブグラフには4つのノードがあります。最大値は3、最小値は1です。この場合は2ですが、差分を返して返したいと思います。これは、グラフデータベース全体で切断されたすべてのサブグラフで発生するはずです。 1つのクエリを使って各サブグラフを処理する方が好きです。つまり、1つのクエリをバッチで実行し、各サブグラフの差分を返すことができます。

私はいくつかの直感を得るために感謝してます。

答えて

1

Neo4jには、切断されたサブグラフの検出や追跡のネイティブサポートがないため、それらを識別するために集中的なフルグラフクエリが必要になるため、実際の問題はこれらのサブグラフを見つけることです。

私は、サブグラフを切断してサブグラフをサブグラフ内の最小のidを持つノードに添付して、this answerに同様の質問を付けるアプローチを提供しました。

一度:サブグラフノードが配置されると、サブグラフに対するバッチクエリを自由に実行できます。

この回答に記載されているように、サブグラフ(新しいサブグラフの作成、サブグラフのマージ、サブグラフの分割)に影響を与えるグラフの変更に追いつくためのアプローチはありません。

EDIT

あなたが持ってたら:切断された各部分グラフに取り付けた部分グラフのノードを、あなたは簡単に部分グラフ上で操作を実行することができます。

あなたは違いを計算するために、このクエリを使用する場合があります。

MATCH (s:Subgraph)-[*]-(subgraphNode) 
WITH DISTINCT s, subgraphNode 
WITH s, MIN(subgraphNode.value) as minimum, MAX(subgraphNode.value) as maximum 
WITH s, maximum - minimum as difference 
... 

あなたがバッチにそのクエリが必要な場合、あなたはおそらくapoc.periodic.iterate()、APOCの手順を使用したいと思います。いくつかのテストの後

EDIT

は、それは、NODE_GLOBALの一意性を使用して、APOC's Path Expander functionalityのように思える部分グラフ内のすべてのノードを見つけるために、より効率的な手段につながります。

私はそれに応じてリンクされた回答を変更しています。これはサブグラフクエリでどのように動作するのですか:

MATCH (s:Subgraph) 
CALL apoc.path.expandConfig(s,{minLevel:1, bfs:true, uniqueness:"NODE_GLOBAL"}) YIELD path 
WITH s, last(nodes(path)) as subgraphNode 
WITH s, MIN(subgraphNode.value) as minimum, MAX(subgraphNode.value) as maximum 
WITH s, maximum - minimum as difference 
... 
+0

ありがとう、しかし、サブグラフの同じクエリで最小値と最大値を取得する方法を教えてください。 – sjishan

+0

大きなグラフの場合、これらのクエリを組み合わせることはお勧めできません。 Subgraphノードを設定するクエリを、サブグラフ上で操作を実行するクエリから分離する方が良い。 – InverseFalcon

+0

私は、可変パスの一致と比較して、サブグラフ内のノードを選択するより速い手段を発見しました。 APOCのPath Expanderにはこれをスピードアップするオプションがあります。 – InverseFalcon

関連する問題