私は現在、Java アプリケーション内で Neo4j データベース バージョン 3.0.3 を使用し、neo4j jdbc ドライバー バージョン 3.0.1 を使用しています (一致しないことはわかっていますが、今のところは問題ないと判断しました)。かなり具体的です。JDBC ライブラリを使用して暗号クエリを作成するときは、ノードにラベルを使用し、関係に型を使用するようにしています。
私のデータセットは、他の Person ノードを認識している Person ノードのネットワークです。KNOWS 関係には、その接続がいつ行われたかを追跡できるようにするための日付があります。以下に示すように、2 つの異なる Person ノード間の経路でデータ マイニングを行いたいと考えました。人々がますます多くの人々を知るようになるにつれて、エンド ノードに未知の関係があるかどうかを確認したいと思います。これには、開始者と終了者の間の経路にある人物ノードと、場合によってはそれらの関係が作成された日付を調べる必要があります。
今日、neo4j ブラウザー機能と Java コードの両方で、かなり具体的なクエリを実行しました。少なくともそう思っていました。
`MATCH path = (p:Person {name: "garret"})-[:KNOWS*1..6]->(p1:Person {name: "adam"}) return path`
上記のクエリは、(garret) と (adam) の間で合計 30 のパスを返しました。Neo4j ブラウザーでのそのクエリの PROFILE は、38 ミリ秒を返すことを示しています。確かに電光石火のように見えます。
StatementResult オブジェクトを使用してそのクエリを Java コードに接続し、クエリを実行すると、以下に示すように list() メソッドを呼び出すと、その実行時間は42.7 秒であることがわかりました。
List<Record> records;
StatementResult r = session.run("MATCH path = (p:Person {name: 'garret'})-[:KNOWS*1..6]->(p1:Person {name: 'adam'}) return path");
records = r.list();
私の質問はこれです:
- list() コマンドにそんなに時間がかかるのはなぜですか?
- Neo4j の結果セットを処理する最良の方法は何ですか?
- その .list() 呼び出しに時間がかかるかどうかを判断するのに役立つ、PROFILE の実行から他のことを調べる必要がありますか?
私はこのプロジェクトの初期段階にいますが、データ セットが大きくなるにつれて、結果を取得するための 42.7 秒は確実にかなり劇的に長くなります。StatementResult からデータを取得する際のこの遅延を最小限に抑える最善の方法について、コミュニティからアドバイスを求めたいと思います。
皆さんが提供できるすべてのアドバイスに感謝します。