Frage

Ich möchte den relativen Prozentsatz der Gesprächsdauer mit Nachbarn ermitteln, die eine bestimmte Person kennen.

Wenn wir beispielsweise Knoten A beobachten, müssen wir zunächst wissen, wie viel Zeit er damit verbracht hat, mit all seinen Nachbarn zu sprechen, was mit der folgenden Abfrage ausgeführt wird:

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 12418           |
==> +-----------------+
==> 1 row, 0 ms

Als nächstes müssen wir prüfen, welcher seiner Nachbarn eine bestimmte Person kennt (z. B. c) und nur die Dauer der Gespräche zwischen a und b addieren, wobei b c kennt:

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b)-[p:KNOWS]->(c) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 21013           |
==> +-----------------+
==> 1 row, 0 ms

Was hier nicht logisch erscheint, ist, dass die zweite Summe größer ist als die erste, während die zweite nur der Teil der ersten sein soll.Weiß jemand, was das Problem sein könnte, um ein solches Ergebnis zu erzielen?Der Fehler trat bei 7 von 15.000 Benutzern auf.

War es hilfreich?

Lösung

Sie betrachten in dieser Abfrage nicht eine bestimmte Person C.Sie ordnen alle Pfade einer beliebigen :KNOWS-Beziehung zu. Wenn Sie also a->b->c und a->b->d haben, wird die Dauer zwischen a->b doppelt gezählt.

Was Sie wahrscheinlich stattdessen tun müssen, ist Folgendes:

start a = node(351061), c=node(xxxxx) // set c explicitly
match (a)-[r:TALKED_TO]->(b)
where b-[:KNOWS]->c // putting this in the where clause forces you to set C
return sum(r.duration)

Hier ist ein Beispiel in der Konsole:http://console.neo4j.org/r/irm0zy

Erinnere dich daran match erweitert und where strafft die Ergebnisse.Sie können dies auch mit tun match, aber Sie müssen c in angeben start.

Eine gute Möglichkeit, zu testen, was Ihre Aggregatfunktionen tun, besteht darin, alle benannten Variablen zurückzugeben (oder einen Pfad festzulegen, den Sie zurückgeben können). Auf diese Weise sehen Sie die Aggregation in Zwischensummen unterteilt.Etwa so:

start a=node(1) 
match a-[r:TALKED_TO]->b-[:KNOWS]->c 
return sum(r.duration), a,b,c;
+-----------------------------------------------------------------------------------------------+
| sum(r.duration) | a                       | b                       | c                       |
+-----------------------------------------------------------------------------------------------+
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[4]{name:"person4"} |
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[3]{name:"person3"} |
| 20              | Node[1]{name:"person1"} | Node[5]{name:"person5"} | Node[6]{name:"person6"} |
+-----------------------------------------------------------------------------------------------+
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top