0

私は現在、MATCH以下のような暗号クエリを実行するために、50000 のノードと 200 万のリレーションシップを持つ neo4j データベースを使用しています。

start startnode = node(42660), endnode = node(30561)
match startnode-[r*1..3]->endnode
return r;

このクエリ自体は 443 行を提供しますが、Cypher に 5 つの一致を見つけてそれらのみを返すようにしたいだけです。明確にさせてください: Cypher に 5 つの結果のみを返すだけではなく、5 つの結果が見つかったら cypher がクエリを停止することも望んでいます。Cypher に 443 件すべての結果を取得させたくありません。

これは現在、LIMIT句を使用して可能ですか? それとも、LIMIT443 件すべての結果が見つかるのを待ってから、最初の 5 件だけを返すのでしょうか?

EDIT :LIMIT句は、このような複雑なクエリの最初のいくつかの結果のみを見つけますか?

start graphnode = node(1), startnode = node(42660), endnode = node(30561)
match startnode<-[:CONTAINS]-graphnode-[:CONTAINS]->endnode
with startnode, endnode
match startnode-[r1*1..1]->endnode
with r1, startnode, endnode
limit 30
match startnode-[r2*2..2]->endnode
with r1, r2, startnode, endnode
limit 30
match startnode-[r3*3..3]->endnode
with r1, r2, r3, startnode, endnode
limit 30
return r1,r2,r3;

profileクエリは次のとおりです。

==> ColumnFilter(symKeys=["  UNNAMED216", "endnode", "r1", "startnode", "r2", "r3"],   returnItemNames=["r1", "r2", "r3"], _rows=30, _db_hits=0)
==> Slice(limit="Literal(30)", _rows=30, _db_hits=0)
==>   PatternMatch(g="(startnode)-['  UNNAMED216']-(endnode)", _rows=30, _db_hits=0)
==>     ColumnFilter(symKeys=["endnode", "  UNNAMED140", "r1", "startnode", "r2"], returnItemNames=["r1", "r2", "startnode", "endnode"], _rows=1, _db_hits=0)
==>       Slice(limit="Literal(30)", _rows=1, _db_hits=0)
==>         PatternMatch(g="(startnode)-['  UNNAMED140']-(endnode)", _rows=1, _db_hits=0)
==>           ColumnFilter(symKeys=["startnode", "endnode", "  UNNAMED68", "r1"], returnItemNames=["r1", "startnode", "endnode"], _rows=1, _db_hits=0)
==>             Slice(limit="Literal(30)", _rows=1, _db_hits=0)
==>               PatternMatch(g="(startnode)-['  UNNAMED68']-(endnode)", _rows=1, _db_hits=0)
==>                 NodeById(name="Literal(List(30561))", identifier="endnode", _rows=1, _db_hits=1)
==>                   NodeById(name="Literal(List(42660))", identifier="startnode", _rows=1, _db_hits=1)
4

1 に答える 1

2

何をするかにもよりますが、この場合、limit 5afterを追加returnすると、遅延して戻り、残りの一致をスキップできます。並べ替えまたは集計したい場合、それはできません。これが動作ではないことがわかった場合は、github の問題として報告してください (使用しているバージョンなどと共に)。

新しいクエリの更新

start graphnode = node(1), startnode = node(42660), endnode = node(30561)
match startnode<-[:CONTAINS]-graphnode-[:CONTAINS]->endnode // do you need this, or is it always going to be true?
with startnode, endnode                                     // ditto. take it out if it doesn't need to be here.
match startnode-[r1*1..1]->endnode // this can probably be simplified to just startnode-[r1]->endnode
with r1, startnode, endnode 
limit 30 // limit to the first 30 it finds in the previous match (this should be lazy)
match startnode-[r2*2..2]->endnode // finds 2 levels deep
with r1, r2, startnode, endnode
limit 30 // limit to the first 30 it finds in the previous match (this should be lazy)
match startnode-[r3*3..3]->endnode
return r1,r2,r3 // the last with you had was extraneous, return will function the same way
limit 30; 

このクエリは遅いので、質問していると思います。startnode-[r*1..3]->endnodeだけではなく、このように分割する理由をお尋ねしてもよろしいlimit 30ですか?最初の match/with が本当に必要ですか、それともそのチェックは不要ですか? の出力を提供できますPROFILEか?

于 2013-07-11T19:26:28.587 に答える