5

Neo4j に大規模なネットワークが保存されています。特定のルート ノードに基づいて、そのノードの周りのサブグラフを抽出し、別の場所に保存したいと考えています。したがって、必要なのは、フィルター条件に一致するノードとエッジのセットです。

私の知る限り、すぐに使用できるソリューションはありません。利用可能なグラフ マッチング コンポーネントがありますが、これは完全一致に対してのみ機能します。Neo4j API 自体は、アクセスするノード/エッジを定義するために使用できるグラフ トラバーサルのみを定義します。

Traverser exp = Traversal
    .description()
    .breadthFirst()
    .evaluator(Evaluators.toDepth(2))
    .traverse(root);

これで、すべてのノード/エッジをすべてのパスのセットに追加できますが、これは非常に非効率的です。どのようにしますか?ありがとう!

EDIT各トラバーサルの最後のノードと最後の関係をサブグラフに追加することは理にかなっていますか?

4

3 に答える 3

3

グラフ マッチングに関しては、これはhttp://docs.neo4j.org/chunked/snapshot/cypher-query-lang.htmlに取って代わられました。

サブグラフ表現の場合、Cypher 出力を使用して、SQL エクスポートのように、グラフを再作成するための新しい Cypher ステートメントを構築する可能性があります。

start n=node:node_auto_index(name='Neo') 
match n-[r:KNOWS*]-m 
return "create ({name:'"+m.name+"'});"

例としてhttp://console.neo4j.org/r/pqf1rp

于 2013-04-19T13:07:21.230 に答える
2

すべてのトラバーサル エンドポイントに基づいて誘導サブグラフを作成することで解決しました。

すべてのトラバーサルの最後のノードとエッジのセットからサブグラフを構築することは機能しません。これは、最短パスの一部ではないエッジが含まれないためです。

コード スニペットは次のようになります。

Set<Node> nodes = new HashSet<Node>();
Set<Relationship> edges = new HashSet<Relationship>();

for (Node n : traverser.nodes())
{
    nodes.add(n);
}

for (Node node : nodes)
{
    for (Relationship rel : node.getRelationships())
    {
        if (nodes.contains(rel.getOtherNode(node)))
            edges.add(rel);
    }
}

すべてのエッジが 2 回追加されます。発信ノードに 1 回、着信ノードに 1 回。Set を使用すると、コレクション内に 1 回だけ存在することを保証できます。

着信/発信エッジのみを反復することは可能ですが、ループ (ノードからそれ自体へのエッジ) がどのように処理されるかは不明です。それらはどのカテゴリーに属しますか? このスニペットにはこの問題はありません。

于 2013-04-22T07:04:26.737 に答える
0

データベースを cypher ステートメントにダンプするを参照してください

dump START n=node({self}) MATCH p=(n)-[r:KNOWS*]->(m) RETURN n,r,m;

最初のデータベース (db1) のサブグラフを 2 番目のデータベース (db2) にインポートする例もあります。

于 2014-04-06T20:04:47.177 に答える