2016-12-07 3 views
2

Ich habe eine Neo4j grafische Darstellung, die ich modelliert als:Wie berechne ich den Unterschied zwischen und Perzentil der Eigenschaften?

MERGE (c1:ChangeTime {at:1800}) 
MERGE (c2:ChangeTime {at:1900}) 
MERGE (c3:ChangeTime {at:2200}) 
MERGE (p:Profile {name:"ME"}) 
MERGE (p)-[:UPDATED_ON]->(c1) 
MERGE (p)-[:UPDATED_ON]->(c2) 
MERGE (p)-[:UPDATED_ON]->(c3) 

Dies ist im Grunde eine vereinfachte Ansicht eines Profils des Individuums, die zu unterschiedlichen Wechselzeiten aktualisiert.

Wie lautet die Abfrage der Chiffre, um den Unterschied zwischen den einzelnen 'at' -Eigenschaften von ChangeTime zu ermitteln, damit ich weiß, wie häufig die Änderung ist?

Und wie berechne ich das Perzentil für einen bestimmten 'Differenz' Wert?

Versuchen, den schnellsten Weg zu finden, dies in einem großen Diagramm anzuwenden.

Vielen Dank im Voraus!

+0

Mit „wie Häufigkeit der Änderung“, meinst du eigentlich „die Änderungsrate“? – cybersam

Antwort

2

What is the Cypher query to get the difference between each ChangeTime's 'at' property so I know how frequency of the change?

Wenn Sie auf Normal Cypher zu halten haben, können Sie ein verwenden list comprehension:

MATCH (p:Profile)-[:UPDATED_ON]->(ct:ChangeTime) 
WITH p, ct 
ORDER BY ct.at 
WITH p, collect(ct.at) AS ct_ats 
RETURN p, [i IN range(0, length(ct_ats)-2) | ct_ats[i+1] - ct_ats[i]] AS diffs 

Das gibt:

╒══════════╤══════════╕ 
│p   │diffs  │ 
╞══════════╪══════════╡ 
│{name: ME}│[100, 300]│ 
└──────────┴──────────┘ 

das Minimum und das Maximum der diff-Werte zu bestimmen , müssen Sie UNWIND die Sammlung und verwenden Sie die min und max Aggregation Funktionen:

MATCH (p:Profile)-[:UPDATED_ON]->(ct:ChangeTime) 
WITH p, ct 
ORDER BY ct.at 
WITH p, collect(ct.at) AS ct_ats 
WITH p, [i IN range(0, length(ct_ats)-2) | ct_ats[i+1] - ct_ats[i]] AS diffs 
UNWIND diffs AS diff 
RETURN p, min(diff) AS minDiff, max(diff) AS maxDiff 

Das gibt:

╒══════════╤═══════╤═══════╕ 
│p   │minDiff│maxDiff│ 
╞══════════╪═══════╪═══════╡ 
│{name: ME}│100 │300 │ 
└──────────┴───────┴───────┘ 
+0

Danke für die Antwort Ich habe die Abfrage kopiert und eingefügt, aber sie zeigt nur einen Knoten für p, aber nicht die Tabelle von p und diffs Spalte Was ist, wenn ich nur den kleinsten und größten Unterschied in diffs für alle th Profile/ps möchte? – user716222

+0

@ user716222, um die Tabelle zu erhalten, wählen Sie einfach "Text" Ausgabe (aus den Graph, Zeilen, Text und Code-Optionen, links zu den Ergebnissen). –

+0

@ user716222 Ich aktualisierte die Antwort mit einer Abfrage, um die kleinsten und größten Unterschiede zu geben. –

1

Ich denke, Sie finden APOC-Verfahren hilfreich, vor allem die collection functions. Vor allem apoc.coll.pairsMin(), das einen Collection-Parameter übernimmt und eine Sammlung von Paaren zurückgibt (so würde eine Eingabe von [1,2,3,4,5] zurückkehren [[1,2], [2,3] , [3,4], [4,5]]).

So ein Ansatz, um dies verwenden, um die Intervalle zwischen den Änderungen für einen bestimmten Benutzer zu bekommen, ist so etwas wie diese:

MATCH (:Profile {name:"ME"})-[:UPDATED_ON]->(c:ChangeTime) 
WITH c 
ORDER BY c.at DESC 
WITH COLLECT(c) as updates 
CALL apoc.coll.pairsMin(updates) YIELD value 
UNWIND value as updatePairs 
WITH updatePairs[0] as update1, updatePairs[1] as update2 
SET update1.interval = update1.at - update2.at 

Und jetzt, wo Sie das Intervall haben, können Sie auf einem Benutzer entsprechen: Change Knoten und erhalten Sie das durchschnittliche Intervall mit avg() bei Bedarf.

Für das Perzentil gibt es Aggregationsfunktionen für diskrete und kontinuierliche Perzentile, siehe Abschnitt Aggregationen der Cypher ref card.

+0

Die Abfrage gibt einen Fehler zurück: Ungültige Eingabe '[': erwartet ein Bezeichnerzeichen, Knotenbeschriftungen, eine Eigenschaftenzuordnung, Leerzeichen, ein Beziehungsmuster, '(', '.', '=' Oder '+ =' (Zeile 7, Spalte 16 (Offset: 200)) "SET updatePairs [0] .interval = updatePairs [0] .at - updatePairs [1] .at" ^ – user716222

+0

Cypher kann Probleme beim Festlegen von Werten für Elemente einer Sammlung haben Ich habe die Abfrage aktualisiert, um jeden Teil des Paares mit einem Alias ​​zu versehen, um zu sehen, ob das den Fehler behebt – InverseFalcon

Verwandte Themen