1

NEO4Jデータベースで「ストレステスト」を行っています。大したことではありませんが、部分的な結果を見ると、このテクノロジがオンライン アプリケーションに適しているかどうか疑問に思います (または、単に Cypher を理解していないだけです)。

最初のテストは、次のようにノードごとに追加することでした

(1° node) -[:NEXT_FRAME]-> () -[:NEXT_FRAME]-> () -[:NEXT_FRAME]-> () -[:NEXT_FRAME]-> ... -[:NEXT_FRAME]-> (last node)

次に、このクエリを使用してパス全体を取得します

START n=node:Frame(node_id="0"), m=node:Frame(node_id="9000")
MATCH p=(n)-[:FRAME_NEXT*]->(m)
RETURN p
ORDER BY m.node_id DESC
LIMIT 1

m.node_id == 2の場合、クエリには約 100 ミリ秒かかることに注意してください。現在、最大 9000 ノードで、最大 30 秒かかる場合があります。私は専門家ではありませんが、時間がかかりすぎます。9K ノードでこれほど大きな違いが生じるとは思いません。

それで、私は何が欠けていますか?

乾杯(そしてメリークリスマス)

編集:

私はpy2neoを使用しており、クエリのタイミングをこのようにしています:

    q_str = """
    START n=node:Frame(node_id="0"), m=node:Frame(node_id="%d")
    MATCH p=(n)-[:FRAME_NEXT*]->(m)
    RETURN p
    ORDER BY m.node_id DESC
    LIMIT 1
    """ % (i,)
    print q_str

    before = datetime.datetime.now()
    query = neo4j.CypherQuery(graph_db, q_str)
    record, = query.execute().data
    after = datetime.datetime.now()
    diff = after - before
    diff_ms = diff.total_seconds() *1000
    print 'Query took %.2f ms' % (diff_ms)
4

3 に答える 3

2

これは Cypher の欠点です。現在、長い可変長パスを適切に処理できません。

試してみMATCH p=shortestPath((n)-[:FRAME_NEXT*]->(m))ませんか?

また、可能であれば、Neo4j 2.0 を試して、従来のインデックスを使用する代わりに、ラベルと新しいインデックスを使用できますか。クエリプランによると、より高速な双方向トラバーサルマッチャーを使用する必要があります。

MATCH (n: Frame {node_id:"0"})-[:FRAME_NEXT*]->(m:Frame {node_id:"9000"})
RETURN p

または、おそらく REST トラバーサーを使用した方がよいでしょう: http://docs.neo4j.org/chunked/milestone/rest-api-traverse.html

または REST-graph-algo: http://docs.neo4j.org/chunked/milestone/rest-api-graph-algos.html

于 2014-01-03T02:45:18.457 に答える
2

nクエリは、との間のすべてのパスを特定しようとしますmが、グラフの形状によっては膨大な数になる可能性があります。

ORDER BYそのような状況では避けるようにしてください。1 つのパスのみを識別する必要があるため、次の方法の方が高速である可能性があります。

START n=node:Frame(node_id="0"), m=node:Frame(node_id="9000")
MATCH p=(n)-[:FRAME_NEXT*]->(m)
RETURN p
LIMIT 1

純粋なパフォーマンスを求めている場合は、トラバーサル APIまたはグラフ アルゴリズムを直接使用することをお勧めします。これには、いくつかの Java コーディングが必要です。

于 2013-12-26T11:28:29.417 に答える
1

パスが 1 つしかない場合は、ドロップODER BYしてLIMIT. また、shortestPath関数を使用してみてください。グラフ内に一致するパスが 1 つしかない場合でも (つまり、すべてのパスが最短の場合でも)、はるかに高速になる可能性があります。最後に、変数の深さの関係の深さがわかっている場合は、それをパターンで宣言します。おおよその深さしかわかっていない場合は、範囲を指定します。これらをいくつか組み合わせて比較してみてください。neo4j-shell でそれらをプロファイリングし、実行計画を確認できます。

MATCH p=(n)-[:FRAME_NEXT*9000]->(m)
MATCH p=(n)-[:FRAME_NEXT*8900..9100]->(m)
MATCH p=shortestPath( (n)-[:FRAME_NEXT*]->(m) )
MATCH p=shortestPath( (n)-[:FRAME_NEXT*8900..9100]->(m) )
于 2014-01-02T14:31:00.577 に答える