1

次の検索を実行するTraversalDescriptionを作成しようとしています。

  • 特定のプロパティ ("type" == "PERSON") を持つノードのみを返す
  • 特定の固定数の結果を返す (グラフ全体が巨大で、ローカル グラフのみに関心がある)
  • 任意の関係タイプを使用できます

ノード プロパティのエバリュエーターを作成する方法がわかりません。

TraversalDescription td = Traversal.description().bredthFirst().evaluator(?...);
4

2 に答える 2

4

これを修正するには、Evaluator インターフェイスを実装し、Evaluator.evaluate(Path p)メソッドを上書きするだけです。

public final class MyEvaluator implements Evaluator {

    private int peopleCount;
    private int maxPeople;

    public MyEvaluator(int max) {
        maxPeople = max;
        peopleCount = 0;
    }

    public Evaluation evaluate(Path p) {

        //prune if we have found the required number already
        if(peopleCount >= maxPeople) return Evaluation.EXCLUDE_AND_PRUNE;

        //grab the node of interest
        Node n = p.endNode();

        //include if it is a person
        if(n.hasProperty("type") && (n.getProperty("type").equals(NodeTypes.PERSON.name()))) {
            peopleCount++;
            return Evaluation.INCLUDE_AND_CONTINUE;
        }

        // otherwise just carry on as normal
        return Evaluation.EXCLUDE_AND_CONTINUE;
    }
}

そして、TraversalDescriptionの定義は次のようになります。

TraversalDescription td = Traversal.description().breadthFirst().evaluator(new MyEvaluator(peopleRequired));
于 2012-07-27T12:51:10.737 に答える
2

Java でコーディングする場合でも、トラバーサル用の Cypher クエリから始めることをお勧めします。パフォーマンスを微調整したり、興味深い操作を実行したりしたい場合にのみ、TraversalDescriptions にドロップダウンします。

あなたが説明したことから、開始ノードのIDを持っていると仮定すると、Cypherクエリは次のようになります。

start n=node(1) match (n)-[*1..2]-(m) where m.type="Person" return distinct(m) limit 2

これにより、開始ノードから 1 ~ 2 ホップ離れたすべてのノードが検索され、任意の関係タイプに従いますが、ノードの type プロパティが「Person」に設定されている場合、最終的に 2 つの異なる結果のみが返されます。コンソールの例を使用してそれを試すことができます(「タイプ」プロパティを追加しました)。

Java 内からそれを実行するには、ExecutionEngine を作成し、クエリを提供してから、Neo4j マニュアルで説明されているように結果を反復処理します。

于 2012-07-25T17:04:37.230 に答える