2017-05-11 7 views
0

Ich habe eine einfache Abfrage cipher, die zu lange dauert zu vervollständigen.Neo4j-Chiffre-Abfrage dauert zu lange

Knotentypen

  • Person {PersonId, PersonEmailAddress}

  • Dokument {DocumentId}

Beziehungsarten: SENT, TO, CC, BCC

Das Konzept lautet:

(p: Person) - [: SENT] -> (d: Dokument) - [: TO | CC | BCC] -> (anotherPerson: Person)

Ich versuche, jene Person, auf die jeder zu bekommen Die angegebene Person hat maximal eine E-Mail gesendet.

Zum Beispiel können Sie in der folgenden Grafik sehen, dass Person # 1 maximal Mails (6 Mails) an Person # 77 und Person # 615 und so weiter gesendet hat. Also hier möchte ich (wie in der folgenden Tabelle erwähnt) Top 5 Person IDs mit Anzahl der Anzahl der an diese Person gesendeten Mail.

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

enter image description here

Ich versuche, die folgende Abfrage:

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

Hier wird mit dieser Abfrage keine Performance-Problem, da nur gibt es 9 dokumentiert die Person # 1 gesendet und nur 15 Personen sind als Empfänger dieser 9 Dokumente beteiligt.

Aber wenn ich die gleiche Abfrage für eine andere Person Feuer, die fast 56.500 Dokumente insgesamt gesandt hat, und insgesamt 869 (distinct) Person als Empfänger beteiligt sind, dauert die Abfrage 43261 ms

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

Die abzuschließen PROFILE ist als unten

enter image description here

Mein Neo4j Browser zeigt Größe: 5,16 GiB unter Datenbank se ction.

Das sind die configs Ich verwende:

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

Irgendwelche Vorschläge oder Ideen, um die Abfrage zu optimieren?

Vielen Dank im Voraus.

EDIT

Nach Neo4j Version von 3.1.1 bis 3.2, die Abfrage dauert noch ca. ms aktualisiert wird.

Antwort

0

Sie sollten in der Lage sein, vom Ursprung Person zu den Empfängern nur durch die Dokumente zu gehen, anstatt einen Unterschied auf den Dokumenten als Zwischenschritt zu knacken.

Wie steht diese Abfrage zu Ihrem Datensatz?

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

Ich glaube nicht, dass Sie etwas über Ihre RAW-DBHITS tun können, wie Sie Ihre Anfrage schon ziemlich minimal ist (die einzige vergebliche Mühe ist, dass DISTINCT nichts im Beispielfall filtert); Aber Sie können versuchen, und parallel Ihre Abfrage ein bisschen wie diese

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 

(Möglicherweise müssen Sie ein „USING JOIN ON d“ irgendwo verwenden Cypher zu machen, die parallel arbeiten brechen)