2017-05-13 2 views
1

Ich habe die Fragen über Unterabfragen gelesen, aber immer noch mit diesem Anwendungsfall fest.Wie Max-Wert in Chiffre Unterabfrage erhalten

Ich habe Dokumente, die ein oder mehrere Schlüsselwörter enthalten und jedes Dokument hat Benutzerkommentare mit einer Statuseigenschaft verknüpft. Ich möchte nur den letzten Status (falls vorhanden) für jedes Dokument in der Abfrage abrufen. Wenn ich eine Abfrage wie die folgende ausführen, bekomme ich nur eine Zeile.

MATCH (d:Document)-[:Keys]->(k:Keywords) 
    WITH d,k 
    OPTIONAL MATCH (d)--(c:Comments) 
    ORDER BY c.created DESC LIMIT 1 
    RETURN d.Title as Title, k.Word as Keyword, c.Status as Status 

Ich habe Hunderte von Dokumenten, die ich mit dem aktuellen Status zurückkehren möchten wie:

Title      Keyword Status 
War in the 19th Century WWI  Reviewed 
War in the 19th Century Weapons Reviewed 
The Great War    WWI  Pending 
World War I    WWI  <null> 

ich mehrere Anfragen WITH-Klausel versucht haben, verwenden, aber ohne Glück noch. Irgendwelche Vorschläge würden geschätzt werden.

Antwort

1

Wir haben eine knowledge base article, die erklärt, wie man Ergebnisse einer Übereinstimmung pro Reihe begrenzt, die Ihnen einige gute Wahlen geben sollte.

EDIT

Hier ist ein vollständiges Beispiel, apoc.cypher.run() mit der begrenzten Unterabfrage durchzuführen.

MATCH (d:Document)-[:Keys]->(k:Keywords) 
WITH d, COLLECT(k.Word) AS Keywords 
// collect keywords first so each document on a row 
CALL apoc.cypher.run(' 
OPTIONAL MATCH (d)--(c:Comments) 
RETURN c 
ORDER BY c.created DESC 
LIMIT 1 
', {d:d}) YIELD value 
RETURN d.Title as Title, Keywords, value.c.status as Status 
+0

Der Anwendungsfall erfordert die Suche nach dem letzten Kommentar, der die Verwendung von ORDER BY und LIMIT erfordert. Wird irgendeine der Techniken in diesem KB-Artikel in diesem Fall helfen? – cybersam

+0

Ja! Ein Beispiel dafür hinzugefügt. – InverseFalcon

+0

Das funktioniert perfekt. Vielen Dank. – AndyP1970

2

Diese Abfrage sollte das tun, was Sie wahrscheinlich gedacht:

MATCH (d:Document)-[:Keys]->(k:Keywords) 
OPTIONAL MATCH (d)--(c:Comments) 
WITH d, COLLECT(k.Word) AS Keywords, c 
ORDER BY c.created DESC 
WHERE c IS NOT NULL 
RETURN d.Title as Title, Keywords, COLLECT(c)[0] AS Status 

Da ein Kommentar zu einem Dokument verknüpft ist, und nicht ein Dokument/keyword Paar, macht es mehr Sinn, eine Sammlung von Schlüsselwörtern zurückkehren für jedes Titel/Status-Paar. Ihre ursprüngliche Abfrage hätte, falls sie funktioniert hätte, das gleiche Titel/Status-Paar mehrmals mit jeweils einem anderen Schlüsselwort zurückgegeben.