2017-11-25 1 views
0

Obere Chiffre ist für das Abrufen aller Kommentare, Antworten und Likes auf diese Kommentare zusammen mit der Überprüfung für einen Benutzer ähnlich wie Benutzer-Feed geschrieben. Die Ausgabe der obigen Abfrage ist unordentlich und wird auf der Anwendungsebene zusammen mit der Paginierung gehandhabt. Irgendwelche Vorschläge, wie man oben genannte Chiffre zusammen mit Seitenumbruch in der Frage selbst optimieren könnte, würde wirklich hilfreich sein.So optimieren Sie unter cypher Abfrage für die Implementierung der Seitennummerierung

+0

Auch gibt es eine Möglichkeit für Sie, um die Grafik zu ändern, um Ihre 'created_at' Eigenschaften auf denen sind : Kommentarknoten statt der Beziehungen? Dies würde die Reihenfolge und die Seitennumerierung ermöglichen, ohne dass die Benutzerknoten, die antworten oder kommentieren, erweitert werden müssen. – InverseFalcon

Antwort

0

Das größte Problem bei dieser Abfrage ist, dass Sie keine Aggregation verwenden, um unabhängige Datensegmente zu sammeln, sodass Sie stattdessen Cross-Produkte zwischen ihnen erhalten, was zur Duplizierung der Ergebnisse in Ihren Daten und sehr wahrscheinlich zum Werfen führt Auch das zählt nicht.

Zum Beispiel, in Ihrer Rückkehr, erzeugen Sie Kreuzprodukte zwischen Ihren Kommentaren und Ihren Bewertungen. In der Tat, ich würde wirklich empfehlen, Bewertungen in einer separaten Abfrage zu bekommen, sonst (vorausgesetzt, Sie sammeln Ihre Bewertungen) Sie erhalten die gleichen Bewertungen mit jedem einzelnen Datensatz, und das scheint verschwenderisch.

Hier ist eine alternative Abfrage, die besser für Sie arbeiten soll (für jetzt, in der Abfrage gesammelt Bewertungen zu halten):

MATCH (user:Users {id: 1}) 
WITH user, [(user)<-[rv:REVIEW]-(rv_user:Users) | rv {.*, reviewer:rv_user}] as reviews 
OPTIONAL MATCH (user)<-[:COMMENT]-(co:Comment)<-[ct_by:COMMENTED_BY]-(c_user:Users) 
WITH reviews, co, ct_by, c_user 
OPTIONAL MATCH (co)<-[:REPLY]-(r_co:Comment)<-[r_co_by:REPLIED_BY]-(r_co_user:Users) 
WITH reviews, co, ct_by, c_user, r_co, r_co_by, r_co_user 
ORDER BY ct_by.created_at DESC, r_co_by.created_at 
SKIP $skip LIMIT $limit 
RETURN reviews, co, ct_by, c_user, r_co, r_co_user, size((co)<-[:LIKES]-()) AS co_likes, size((r_co)<-[:LIKES]-()) AS r_co_likes 

wir eine Kombination aus Mustern Verständnis verwenden und Kartenprojektion in dem ersten WITH-Klausel zusammen mit dem Gutachter Bewertungen sammeln.

Nachdem wir fertig sind passend, um ct_by und r_co_by wir Paginierung mit SKIP und LIMIT anwenden können, wenn Sie diese Parameter versorgen müssen, und rufen Sie die Abfrage für die nächste Seite, in Vielfachen der Grenze übersprungen (man kann ändere diese entsprechend, wenn es das leichter macht).

Wir verwenden die Funktion size() für ein Muster, um die Anzahl der Vorkommen zu erhalten. Dies ist einfacher, um die Likes zu erhalten, vor allem, da dies aus den Daten des Beziehungsgrads auf dem Knoten selbst stammt und nicht erweitert werden muss (vorausgesetzt dass alle: LIKES Beziehungen sind von: Benutzer).

können wir verbessern noch mehr von hier zum Beispiel für jeden Kommentar der Antwortdaten zu sammeln:

MATCH (user:Users {id: 1}) 
WITH user, [(user)<-[rv:REVIEW]-(rv_user:Users) | rv {.*, reviewer:rv_user}] as reviews 
OPTIONAL MATCH (user)<-[:COMMENT]-(co:Comment)<-[ct_by:COMMENTED_BY]-(c_user:Users) 
WITH reviews, co, ct_by, c_user 
OPTIONAL MATCH (co)<-[:REPLY]-(r_co:Comment)<-[r_co_by:REPLIED_BY]-(r_co_user:Users) 
WITH reviews, co, ct_by, c_user, r_co, r_co_by, r_co_user 
ORDER BY ct_by.created_at DESC, r_co_by.created_at 
SKIP $skip LIMIT $limit 
WITH reviews, co, ct_by, c_user, r_co, r_co_user, size((co)<-[:LIKES]-()) AS co_likes, size((r_co)<-[:LIKES]-()) AS r_co_likes 
RETURN reviews, co, ct_by, c_user, co_likes, collect(r_co {.*, replier:r_co_user, likes:r_co_likes}) as replies 
Verwandte Themen