Von einer Reihe von Sachen zu mögen, möchte ich herausfinden, wie viele von einer Reihe von Benutzern mögen, was Zeug.Neo4j cypher optimization
Es gibt Indizes für das User-Label für die userId-Eigenschaft sowie für das StuffToLike-Label und seine stuffId-Eigenschaft.
Die Parameter {users} und {stuff} erhalten Arrays mit IDs. Für diese Phase enthält das Array {users} zwischen 100 und 1.000.000 Strings, während das Array {stuff} 100 Strings enthält.
Dies ist die einfachste und schnellste Lösung mit den geringsten dB-Hits, die ich bis jetzt erreicht habe.
MATCH (u:User) WHERE u.userId IN {users}
MATCH (n:StuffToLike) WHERE n.stuffId IN {stuff}
OPTIONAL MATCH (n)<-[l:LIKES]-(u)
OPTIONAL MATCH (n)<-[d:DISLIKES]-(u)
RETURN {
stuffId: n.stuffId,
name: n.name,
likes: count(l),
dislikes: count(d)
} AS stuff
Ich erwarte nicht, Echtzeit Verwendbarkeit für diese Menge an Daten (noch) nicht, aber es wäre toll, wenn ich dies in einer angemessenen Höhe der Zeit ausgeführt werden kann.
Danke. Die Db-Hits sind deutlich reduziert und es ist etwas schneller. Ich werde es gegen einen größeren Satz ausführen, wenn die Last auf dem Server niedriger ist. Die Gesamtpopularität von StuffToLike, wie in Ihrer zweiten Abfrage gezeigt, ist ziemlich schnell. Es verlangsamt sich wirklich, wenn man nur die Popularität aus dem sich ständig verändernden Benutzerkreis betrachtet. – manonthemat