2017-03-29 15 views
0

を行う方法は、これは私がしたいことはあるので、基本的に私のデータモデルのNeo4j - ポスト処理UNION(ページネーション)私は私のNeo4j DBからデータをロードするCYPHERクエリを書いている

data model

ですそのプロパティと、それに関連するすべてのもののすべてで雑誌を返すために、クエリ、アイブ氏は、単純なクエリを実行しようとしたが、それがすべてではパフォーマンスではなく、DBがホストされている私のEC2インスタンスがメモリ不足に迅速 MATCH p=(j:Journal)-[*0..]-(n) RETURN p

私はUNIONS

を使用してクエリを書き込むことができました
`MATCH p=(j:Journal)<-[:BELONGS_TO]-(at:ArticleType) RETURN p 
UNION 
MATCH p=(j:Journal)<-[:OWNS]-(jo:JournalOwner) RETURN p 
UNION
 
MATCH p=(j:Journal)<-[:BELONGS_TO]-(s:Section) RETURN p 
UNION 

MATCH p=(j:Journal)-[:ACCEPTS]->(fc:FileCategory) RETURN p 
UNION 
MATCH p=(j:Journal)-[:CHARGED_BY]->(a:APC) RETURN p 
UNION 
MATCH p=(j:Journal)-[:ACCEPTS]->(sft:SupportedFileType) RETURN p 
UNION 
MATCH p=(j:Journal)<-[:BELONGS_TO|:CHILD_OF*..]-(c:Classification) RETURN p 

SKIP 0 LIMIT 100`

クエリが正常に動作し、その性能は全く悪いことではありません、私は見つけることだ唯一の問題は、私の周りグーグルでてきたと私はきた、限界であり、 UNIONSを使用した後処理問合せはまだサポートされていないことが分かりました。

参照githubの問題がまだ解決されていないので、UNIONの処理を投稿まだ不可能である

私はこの問題に出くわしたときに私が試した論理的に最初にすることは、個々のクエリに改ページを入れていましたしかし、これは自分自身にはあまり意味がない奇妙な行動をしていました。

だから私はユニオンを使用せずにクエリを記述してみました、私はこのクエリは、しかし、私のDBを壊すこの

`MATCH (j:Journal) 
WITH j LIMIT 10 
MATCH pa=(j)<-[:BELONGS_TO]-(a:ArticleType) 
MATCH po=(j)<-[:OWNS]-(o:JournalOwner) 
MATCH ps=(j)<-[:BELONGS_TO]-(s:Section) 
MATCH pf=(j)-[:ACCEPTS]->(f:FileCategory) 
MATCH pc=(j)-[:CHARGED_BY]->(apc:APC) 
MATCH pt=(j)-[:ACCEPTS]->(sft:SupportedFileType) 
MATCH pl=(j)<-[:BELONGS_TO|:CHILD_OF*..]-(c:Classification) 
RETURN pa, po, ps, pf, pc, pt, pl` 

を思い付いた私はCQLのクエリを記述するために不可欠な何かが欠けているように、私は感じて...

私もこのneo blog postでCOLLECTとUNWINDを調べましたが、実際にそれを理解できませんでした。

ユニオンを削除せずにクエリにページを設定するにはどうすればよいですか?または、ジャーナル・レベルでページネーションを適用でき、パフォーマンスに影響を与えないように、他のクエリ作成方法がありますか?

--- EDIT ---ここ

は私の2番目のクエリ

enter image description here

+1

ていますか?もしそうなら、この回答は役に立ちます:http://stackoverflow.com/questions/41448935/order-by-the-result-of-union-of-subqueries –

+1

@GaborSzarnyas私はAPOCから離れようとしていました。プレーンなCypher言語を使ってそれを達成してください。しかし、私の周りの唯一の仕事がそれを使うことを検討していれば。 – Juanpe

+0

@ gaborSzarnyas私はAPOCをインストールしていますが、私はクエリを使って遊んでいます。あなたが提供した質問に対する答えに従ってきましたが、最初のクエリと同じ動作をします。ジャーナルノード..どのようにパスの代わりにジャーナルノードに制限を適用できますか? – Juanpe

答えて

2

のための実行計画では、UNIONを使用して、これを近づいたときので、あなたは本当に、このためにUNIONを必要としないですジャーナル・ノードでは、すべての関連ノードがすべて取得されています。ジャーナル・ノードは、結果セットを制限しますか?これはあなたのLIMITのためにのみ除外されるたくさんの仕事です。

2番目のクエリは、より正確なアプローチのように見えます。ジャーナルノードはLIMITでマッチングされ、リターンのために関連ノードでマッチングが行われます。

2番目のクエリでDBが破損したとします。クエリ(またはクエリが実行を終了しない場合はEXPLAIN)でPROFILEを実行し、プランのすべての要素を展開して説明に追加できますか?

また、最後のMATCHを:Classificationに指定しないと、クエリは正しく動作しますか?

また、実際にパスが返されるかどうか、または接続されたノードを返すだけで十分かどうかを知るのに役立ちます。あなたはそれぞれの場合

EDIT

は:ジャーナルと単一行上のすべての接続されたデータを、あなたはどちらか、各試合の後に()COLLECT使用して、またはpattern comprehensionはそうではすでに結果がコレクション内で使用する必要があります。

これにより、不要なクエリも削減されます。最初のマッチ(制限後)は31k行を生成したので、その後のすべてのマッチは31k回実行されました。パターンの理解を収集()したり、使用したりすると、カーディナリティは初期の10に抑えられ、冗長なマッチを防ぐことができます。あなただけの場合は、このような

何かが、収集されたパスが返さ:あなたはAPOCを使用することが

MATCH (j:Journal) 
WITH j LIMIT 10 
WITH j, 
[pa=(j)<-[:BELONGS_TO]-(a:ArticleType) | pa] as pa, 
[po=(j)<-[:OWNS]-(o:JournalOwner) | po] as po, 
[ps=(j)<-[:BELONGS_TO]-(s:Section) | ps] as ps, 
[pf=(j)-[:ACCEPTS]->(f:FileCategory) | pf] as pf, 
[pc=(j)-[:CHARGED_BY]->(apc:APC) | pc] as pc, 
[pt=(j)-[:ACCEPTS]->(sft:SupportedFileType) | pt] as pt, 
[pl=(j)<-[:BELONGS_TO|:CHILD_OF*..]-(c:Classification) | pl] as pl 
RETURN pa, po, ps, pf, pc, pt, pl 
+0

こんにちは@InverseFalcon、あなたの答えをありがとう...実行計画のpngを添付しました。最適化されていないことがわかりました。そのため、私はユニオンに移動してパフォーマンスが向上しましたが、明らかに後処理が可能ではないようです。 ジャーナルをJavaオブジェクトにマップするためにOGMを使用するときにパスが必要だと思うので、パスを返さないとジャーナルオブジェクトに他のノードをロードしないか、少なくともこれは私の理解です。 – Juanpe

+0

なぜダブルWITH?これはパフォーマンスを向上させ、DBを壊すことはありませんが、クエリに分類を含めると、パスを返すのに2分以上かかります。 – Juanpe

+0

二重のWITHはここでは本当に必要ではありませんが、リターンにLIMITを配置することができます。明示的に結果を明示的にLIMITする傾向があるので、RETURNの前に操作を追加するなど、問合せを変更する必要がある場合は、LIMITが正しい場所にあり、問合せを効率的に保ちます。 – InverseFalcon

関連する問題