2016-04-19 14 views
1

Ich möchte Cypher-Ergebnisse in Chunks von 100 Zeilen aufteilen und in der Lage sein, einen bestimmten Chunk abzurufen.Schneiden von Neo4j Cypher führt zu Chunks

Im Moment ist der einzige Weg, um sicherzustellen, dass die Zeilen nicht mixed-up sind zu Benutzer ORDER BY das macht die Abfrage sehr ineffizient (3 Sek. Zu viel für mich ist)

MATCH (p:Person) RETURN p.id ORDER BY p.id SKIP {chunk}*100 LIMIT 100 

where {chunk } ist ein externer Parameter, um einen bestimmten Chunk zu identifizieren.

Irgendwelche Vorschläge?

PS: die Eigenschaft p.id ist indiziert.

+0

Warum brauchen Sie Brocken ? Können Sie keine größeren Batches, wie z. B. 100.000, abrufen? –

+1

Sie können den Cursor auch geöffnet lassen und gleichzeitig 100 vom Cursor lesen –

+0

Sie können externe Engine für den Index verwenden. Zum Beispiel "Elasticsearch". –

Antwort

0

Sie etwas versuchen, zu Person wie das Hinzufügen Etikett vor dem Brocken zu extrahieren und dann mit Hilfe von Abfrage wie

Match (p:Chunk:Person) with p LIMIT 100 
Match (p) remove p:Chunk 
Return * 
0

Wenn die p.id Werte sind einzigartig und dichte (sagen wir, beginnt der Wert bei 1 und Schritten, ohne Lücken), dann wird diese Abfrage Vorteil des Index auf :Person(id) nehmen effizient jede hundert Person Brocken zu erhalten:

WITH (({chunk} - 1) * 100 + 1) AS startId 
MATCH (p:Person) 
WHERE p.id IN RANGE(startId, startId + 99) 
RETURN p.id 
ORDER BY p.id 

nun praktisch gesprochen, Ihre id Raum wird wahrscheinlich nicht dicht bleiben, auch wenn es so begann. Person Knoten werden im Laufe der Zeit gelöscht. In diesem Fall kann die obige Abfrage weniger als 100 Zeilen zurückgeben. So können Sie Ihre Chunk-Größe größer als 100 machen und eine Nachbearbeitung durchführen, um die 100 zu erhalten, die Sie brauchen. Im schlimmsten Fall müssen Sie möglicherweise mehrere Anfragen stellen, um die 100 zu erhalten, die Sie benötigen, aber jede Anfrage ist schnell. (Im Idealfall würden Sie No-longer-ungenutzt id Werte zu neuen Person Knoten zuweisen, zu füllen Lücken in dem id Raum - aber das würde verlangen, dass Sie für die Lücken zu scannen.)