0

最近、学校で MySQL と Neo4j を比較する宿題を出しています。

「Graph Databases」という本と「Neo4j in Action」という本の最初の章を読みました。どちらの本でも、MySQL と Neo4j の違いを示しています"。

ここでは Joerg Baach 氏をフォローして、mysql と比較した neo4j のパフォーマンス (どのように改善できますか?)と同じ結果を得ました。インデックスを追加した後の MySQL はかなり高速で、Cypher は時間内に結果を取得するのに苦労しました。

その後、トラバーサル フレームワークを使用することにしました。これが私のクエリです:

for (Path p: t.description()
                .depthFirst()
                .relationships(RelTypes.friend, Direction.OUTGOING)
                .evaluator(Evaluators.atDepth(4))
                .uniqueness(Uniqueness.NODE_LEVEL)
                .traverse(graphDb.index()
                        .forNodes("node_auto_index")
                        .get("noscenda_name", "person3200")
                        .getSingle()))
{
      //....
}

ここで、結果を返すのにかかる時間を測定する必要があります。Neo4j Traversal APIのマニュアルから読んだ

Traverser オブジェクトは、TraversalDescription オブジェクトの traverse() を呼び出した結果です。これは、グラフに配置されたトラバーサルと、結果の形式の仕様を表します。実際のトラバーサルは、Traverser の反復子の next() メソッドが呼び出されるたびに遅延実行されます。

実際のトラバーサルは、next() メソッドが呼び出されるたびに実行されます。したがって、時間を測定したい場合は、ループが終了するまで待つ必要があります。私は正しいですか?

そして、私が正しければ、深さ 4 で結果を返すのに約 60 秒かかるため、Traversal API のパフォーマンスは非常に悪いです。パフォーマンスを改善するための提案はありますか?

4

1 に答える 1

0

必要以上のリレーションシップがトラバースされる、一意性の問題である可能性があります。できるよ:

トラバーサー トラバーサー = t.description()
                .depthFirst()
                .relationships(RelTypes.friend, Direction.OUTGOING)
                .evaluator(Evaluators.atDepth(4))
                .一意性 (一意性.NODE_LEVEL)
                .traverse(graphDb.index()
                        .forNodes("node_auto_index")
                        .get("noscenda_name", "person3200")
                        .getSingle());
for (パス p: トラバーサー) { ... }
traverser.metadata().getNumberOfRelationshipsTraversed() / getNumberOfPathsReturned()

実行した他のクエリとの比較を確認します。おそらく、Uniqueness.NODE_PATH を試すことができます。

別のメモ: 深さ 4 のすべてのユーザーを一覧表示するユース ケースは何ですか? それは常にかなり多くなるでしょう。より現実的なユースケースを試して比較すると、どのように積み重なるでしょうか?

于 2013-10-01T07:00:42.450 に答える