2017-03-14 15 views
0

に関連して、特定のラベルを持つノードを探す:ソースノード のNeo4j - パフォーマンス:私は、次の要件を持っているソースノード

  • 考える

    • が一定の範囲内のすべてのノード(例えば4つのホップを探します)
    • と宛先ノードiは2つのホップのノードを見つけた場合、特別なラベル「X」
    • は、最短経路長(例えば、先
    • リターンパス内のノードのラベルの種類を制限しています、見つけられないまた、3つのまたは4ホップ)
    • 戻り、私は、クエリを作成するために管理が、パフォーマンスはそれほどうまくない

  • 間宛先ノードとパスを示すために必要なすべてのノードとノード。私はそれがラベルであるため、ノードの高い量であると仮定し

    MATCH path = allShortestPaths((source)-[*..4]-(destination)) 
    WHERE source.objectID IN ['001614914'] 
    AND source:Y 
    AND destination:X 
    AND ALL(x IN nodes(path)[1..] WHERE any(l in labels(x) WHERE l in ['A', 'B', 'C'])) 
    WITH path 
    LIMIT 1000 
    WITH COLLECT(path) AS paths, MIN(length(path)) AS minLength 
    WITH FILTER(p IN paths WHERE length(p)= minLength) AS pathList 
    LIMIT 25 
    UNWIND pathList as path 
    WITH [n in nodes(path)] as nodes 
    return nodes 
    

    を「x」はプロフィール: Profile with shortest path

    私はない最短経路の機能を使用するようにクエリを変更した場合と、これがうまく機能します送信パスのソースは持っていない多くの

    MATCH path = ((source)-[*..4]-(destination)) 
    WHERE source.objectID IN ['001614914'] 
    AND source:Y 
    AND destination:X 
    AND ALL(x IN nodes(path)[1..] WHERE any(l in labels(x) WHERE l in ['A', 'B', 'C'])) 
    WITH path 
    LIMIT 1000 
    WITH COLLECT(path) AS paths, MIN(length(path)) AS minLength 
    WITH FILTER(p IN paths WHERE length(p)= minLength) AS pathList 
    LIMIT 25 
    UNWIND pathList as path 
    WITH [n in nodes(path)] as nodes 
    return nodes 
    

    プロフィール: Profile without shortest path

    しかし、私は多くの子供たちと一緒にソースノードを持っている場合、これはまた、悪い性能を持っています...

    私はすべての目的地を簡単に検索し、各発見された目的地しかし、私はよく分からない。

    MATCH (source)-[*..4]-(destination) 
    WHERE source.objectID IN ['001614914'] 
    AND source:Y 
    AND destination:X 
    WITH destination 
    LIMIT 100 
    call apoc (shortest path ...) 
    ... 
    

    さらに良い方法がありますか?

    答えて

    2

    「NODE_GLOBAL」の一意性を使用してAPOCのパスエクスパンダを試してみるとよいでしょう。通常、可変長マッチよりも優れています。また、トラバース中にノードをホワイトリストに登録する方法もありますが、開始ノードにも適用されるため、ホワイトリストにYを含める必要があります。

    これはあなたのために働くかどうかを確認してください:

    MATCH path = (source:Y) 
    WHERE source.objectID IN ['001614914'] 
    CALL apoc.path.expandConfig(source, {labelFilter:'+A|B|C|Y', maxLevel:4, uniqueness:'NODE_GLOBAL'}) YIELD path 
    WITH path, last(nodes(path)) as destination 
    WHERE destination:X AND NONE(node in TAIL(nodes(path)) WHERE node:Y) 
    // all the rest is the same as your old query 
    WITH path 
    LIMIT 1000 
    WITH COLLECT(path) AS paths, MIN(length(path)) AS minLength 
    WITH FILTER(p IN paths WHERE length(p)= minLength) AS pathList 
    LIMIT 25 
    UNWIND pathList as path 
    RETURN NODES(path) as nodes 
    
    +0

    私は制限の上司を説得してみてください^^ – mabr

    +0

    ソリューションのこの種は非常に容易になりますAPOCに彼らの方法のいくつかの変更がありますが、のような開始ノードにラベルフィルタを適用するかどうかを指定するオプション(ラベルフィルタに 'Y'を指定する必要はない)と複数のフィルタ操作を同時に使用できるようにするオプションパスのエンドノードのラベル、およびホワイトリスト)。リミット操作も進行中です。新しいリリースがいつ起こるのかは分かりませんが、今後2週間程度で起こる可能性があります。 – InverseFalcon

    関連する問題