1

1 つ目は次のとおりです。パスを指定する一連のプロパティを指定すると、終了ノードを返す必要があります。すなわち

start r=node(0)
match r<-[:R]-({n:"aaa"})<-[:R]-({n:"bbb"})<-[:R]-(x {n:"ccc"})
    return x as node

2 つ目はその逆です。ノードの識別子 (簡単にするために、ノードの ID と仮定します) を指定nameすると、ルートからノードへのパス (プロパティのシーケンス) を返します (一意であることが保証されます)。今のところ、私は次のものを使用していshortestPathます:

start n=node(1000), root = node(0) 
match p = shortestPath(root<-[:R*]-n) 
return
    reduce(fullpath = '', pt IN nodes(p) | fullpath + pt.n)
    as path

クエリは組み込みデータベースから実行され、速度に満足できないため、クエリを TraversalDescriptions に変換したいのですが、動的に変更する必要があり、これを行う方法がよくわかりません。

それとも、これらのクエリが最適ではないのでしょうか? <= 1shortestPathミリ秒実行されるものと、可変長のものは単一のクエリごとに 10 ミリ秒実行されます (これは受け入れられません)。多分あなたは私のためのいくつかのパフォーマンスのヒントを持っていますか?

4

1 に答える 1

2

次のようなことができます。アイデアは、現在のノードのプロパティが値のシーケンスと一致する場合にのみ、パスをたどりますが、パスを展開し続けることです。以下のコードはテストしていないので、タイプミスや欠落があると仮定します。

Node r = db.getNodeById(0);
String[] sequence = {"aaa","bbb","ccc"};

Traverser traverser = Traversal.description()
                .depthFirst()
                .expand(new ArrayExpander(sequence))
                .evaluator(Evaluators.atDepth(sequence.length()))
                .uniqueness(Uniqueness.NONE)
                .traverse(r);

for ( org.neo4j.graphdb.Path p : traverser )
        {
            //do something with the nodes accessible by p.nodes()
        }

パス エキスパンダーは次のようになります。

public class ArrayExpander implements PathExpander {

private String[] sequence;

public ArrayExpander(String[] sequence)
{
    this.sequence = sequence;
}

public Iterable<Relationship> expand(Path path, BranchState state){
    if(path.endNode().getProperty("n").equals(sequence[path.length()]){
      return path.endNode().getRelationships(Direction.INCOMING);
    } else {
      return path.endNode().getRelationships(DynamicRelationshipType.withName("IDONTEXIST"));
     }

}

public ArrayExpander reverse()
{
    return new ArrayExpander(Collections.reverse(Arrays.asList(sequence)));
}
}
于 2014-01-17T21:56:48.623 に答える