py2neo (1.5.1) と neo4j (1.9.2) を使用して、さまざまなコマンドのパフォーマンスについて疑問に思っています (グラフには約 80k の関係があります)。
最初にすべての関係 (~80k) を取得しますが、これには明らかに時間がかかります。
graph_db = neo4j.GraphDatabaseService("http://localhost:7474/db/data/")
rels = graph_db.match()
しかし、リレーションをループして出力する (または何らかの変数に保存する) のに、なぜ驚くほどの時間 (約 1 ~ 2 分) がかかるのでしょうか? rels
は関係のリストですが、各関係には何が含まれているのでしょうか?
for relation in rels:
print relation.start_node
print relation.type
print relation.end_node
print relation.get_properties()
行を削除するprint relation.get_properties()
と、ループの実行時間が大幅に短縮されます (~10 秒)。それで、それぞれrelation.get_properties()
がデータベースに対してクエリを実行すると思いますか?合理的に聞こえます。
print relation
ただし、私にとっては奇妙なことです。必要な情報がすべて含まれているにもかかわらず、次のコードがはるかに高速なのはなぜですか?
for relation in rels:
print relation #example output: (244358)-[:KNOWS {"since":2011,"reason":"unknown"}]->(244359)
print relation.start_node
print relation.type
print relation.end_node
そのため、必要なすべての情報が実際に出力され、その実行がはるかに高速になりますが、関係のプロパティを抽出して変数に格納することはできません。
for relation in rels:
print relation #example output: (244358)-[:KNOWS {"since":2011,"reason":"unknown"}]->(244359)
print relation.start_node
print relation.type
print relation.end_node
#print relation["since"] #would slow down the execution significantly, why??
では、リレーションシップにはどのような情報が保存されるのでしょうか? を使用せずにすべてのプロパティを抽出するにはどうすればよいですかget_properties()
。これはキャッシュと関係がありますか?わかりません、これは私を狂わせています...私はすでにあなたの答えを楽しみにしています、ナイジェル;-)
注: バッチを使用して最適化できることはわかっていますが、それは今のところ問題ではありません。
編集:print relation["since"]
反復ごとにクエリも発生しますか?
EDIT2:パフォーマンスについて話しているときに、もう 1 つ: 次の暗号クエリを比較すると、最初のクエリが 2 番目のクエリよりも遅いことがわかりました。なぜですか? (コールドグラフ上で実行されるため、キャッシュの影響はありません)
query1: START n=ノード(*) RETURN n
query2: START n=node(*) RETURN n.name, n.age