2017-05-11 26 views
0

シンプルなサイファークエリがあり、完了までに時間がかかりすぎます。Neo4j cypherクエリーが長すぎます

ノードタイプ

  • 人{PERSONID、PersonEmailAddress}

  • 文献{文書ID}

関係タイプ: SENT、TO、CC、BCC

コンセプトは:

(P:人) - [:SENT] - >(D:ドキュメント) - [:TO | CC | BCC] - >(anotherPerson:人)

私はそれらの人いずれかをするを取得しようとしています与えられた人が最大のメールを送りました。

たとえば、Person#1がPerson#77とPerson#615に最大メール(6メール)を送信したことを次の図に示します。そこでここでは、その人に送信されたメール数の上位5人のIDを(下の表に示すように)欲しいと思います。

+------------+-----------------------+ 
| ReceiverId | NumberOfMailsReceived | 
+------------+-----------------------+ 
|   77 |      6 | 
|  615 |      6 | 
|  101 |      4 | 
|  247 |      4 | 
|  252 |      4 | 
+------------+-----------------------+ 

enter image description here

私は、次のクエリをしようとしている:

MATCH(p:Person{PersonId:1})-->(d) WITH DISTINCT d 
MATCH (d)-->(rc) 
RETURN rc, COUNT(rc) as c ORDER BY c DESC LIMIT 5 

のみだけで9人#1が送信した文書とがあるのでここでは何のパフォーマンス上の問題は、このクエリではありません15人がこの9文書のレシーバーとして参加しています。

しかし、私は合計にほぼ56,500の文書を送信した、との合計869(明確な)人がレシーバとして関与している別の人のために同じクエリを発射した場合、クエリは

Cypher version: CYPHER 3.1, planner: COST, runtime: INTERPRETED. 21570218 total db hits in 43261 ms. 

完了するまでに43261ミリ秒かかります5.16ジブ下のデータベース SE:PROFILEは私のNeo4jのブラウザはサイズを示し

enter image description here

以下の通りですction。

dbms.memory.heap.initial_size=8G 
dbms.memory.heap.max_size=8G 
dbms.memory.pagecache.size=4g 

任意の提案やアイデアを、クエリを最適化するために:

これは私が使用しているコンフィグですか?

ありがとうございます。

EDIT

3.2に3.1.1からのNeo4jのバージョンを更新した後、クエリがまだ約ミリ秒かかります。

答えて

0

中間のステップとして文書の別名をクランチするのではなく、送信元Personから受信者に渡すだけでよいはずです。

このクエリはデータセットに対してどのように耐えられますか?

MATCH(p:Person {PersonId:1}) 
WITH p 
MATCH (p)-->(:Document)-->(rc:Person) 
RETURN rc, COUNT(rc) AS c 
ORDER BY c DESC 
LIMIT 5 
0

私は(だけ無駄な努力は、DISTINCTが例の場合には何もフィルタしていないということです)クエリがすでにかなり最小限であるとして、あなたの生のDBHITSについて何かを行うことができるとは思いません。しかし、あなたは試してみて、ビットのようにクエリを並列CANこの

MATCH (p:Person{PersonId:1})-->(d) 
MATCH (d)-[:TO]->(rc) 
WITH d, COLLECT(rc) AS list 
MATCH (d)-[:CC]->(rc) 
WITH d, list + COLLECT(rc) AS list 
MATCH (d)-[:BCC]->(rc) 
WITH d, list + COLLECT(rc) AS list 
UNWIND list AS rc 
RETURN rc, COUNT(rc) as c 
ORDER BY c DESC 
LIMIT 5 

(あなたは、サイファー並行して作業を分割するためにどこかに「D上の USING JOIN」を使用する必要がある場合があります)
関連する問題