2017-02-06 17 views
0

私は、次のCYPHERクエリがある:のNeo4jサイファークエリの改善(パフォーマンス)

CALL apoc.index.nodes('node_auto_index','pref_label:(Foo)') 
YIELD node, weight 
WHERE node.corpus = 'my_corpus' 
WITH node, weight 
MATCH (selected:ontoterm{corpus:'my_corpus'})-[:spotted_in]->(:WEBSITE)<-[:spotted_in]-(node:ontoterm{corpus:'my_corpus'}) 
WHERE selected.uri = 'http://uri1' 
     OR selected.uri = 'http://uri2' 
     OR selected.uri = 'http://uri3' 
RETURN DISTINCT node, weight 
ORDER BY weight DESC LIMIT 10 

(WITHまで)最初の部分は(Luceneのレガシー指数)非常に高速で動作し、〜100個のノードを返します。 uriプロパティも一意です(選択= 3ノード) 私は約300のWEBSITEノードを持っています。実行時間は48749 msです。

プロフィール: enter image description here

がどのようにパフォーマンスを向上させるために、クエリを再構築することができますか?なぜプロファイルに〜13.8 Mioの行があるのですか?

答えて

1

私は問題が膨大な結果を広げたWITH節にあったと思います。 InverseFalconの答えは、クエリーをより速くします:49 - > 18 sec(ただし、それでも十分速くはありません)。膨大な拡大を避けるために、私はウェブサイトを収集しました。以下のクエリは60msかかる。

MATCH (selected:ontoterm)-[:spotted_in]->(w:WEBSITE) 
WHERE selected.uri in ['http://avgl.net/carbon_terms/Faser', 'http://avgl.net/carbon_terms/Carbon', 'http://avgl.net/carbon_terms/Leichtbau'] 
AND selected.corpus = 'carbon_terms' 
with collect(distinct(w)) as websites 
CALL apoc.index.nodes('node_auto_index','pref_label:(Fas OR Fas*)^10 OR pref_label_deco:(Fas OR Fas*)^3 OR alt_label:(Fa)^5') YIELD node, weight 
WHERE node.corpus = 'carbon_terms' AND node:ontoterm 
WITH websites, node, weight 
match (node)-[:spotted_in]->(w:WEBSITE) 
where w in websites 
return node, weight 
ORDER BY weight DESC 
LIMIT 10 
0

プラン内にNodeUniqueIndexSeekが表示されないため、selectedノードが効率的に検索されていません。

:ontoterm(uri)に一意制約が設定されていることを確認してください。

ユニーク制約がアップした後、これを試してみる:

PROFILE CALL apoc.index.nodes('node_auto_index','pref_label:(Foo)') 
YIELD node, weight 
WHERE node.corpus = 'my_corpus' AND node:ontoterm 
WITH node, weight 
MATCH (selected:ontoterm) 
WHERE selected.uri in ['http://uri1', 'http://uri2', 'http://uri3'] 
AND selected.corpus = 'my_corpus' 
WITH node, weight, selected 
MATCH (selected)-[:spotted_in]->(:WEBSITE)<-[:spotted_in]-(node) 
RETURN DISTINCT node, weight 
ORDER BY weight DESC LIMIT 10 

は、クエリプランを見てみましょう。そこにNodeUniqueIndexSeekがあるはずです.dbヒットのドロップがあるはずです。

関連する問題