2016-06-02 9 views
0

Ich habe eine naive Frage in Bezug auf die Verwendung von Schlüsselwort DISTINCT. Also im Grunde habe ich eine Grafik (User- [Likes] -> Item) mit Millionen Knoten. Ich möchte verschiedene Benutzer finden, die einen bestimmten Artikel mögen. Die folgenden zwei Abfragen haben erhebliche Leistungsunterschiede, und ich bin verwirrt. Ich erstelle einen Index von: Item (id) und: User (id).Neo4j Abfrage Leistung mit Schlüsselwort distinct

Abfrage 1:

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User) 
return count(distinct u); 

Abfrage 2:

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User) 
return distinct u; 

Die erste Abfrage gibt in Sekunden zur Folge haben, aber die zweite Abfrage hält länger als 5 Minuten laufen und ich verlor Patienten und die Abfrage stoppen . Ich dachte, die zweite Abfrage wäre schneller als die erste Abfrage, da es keine Zählungsaggregationsoperation gibt, daher verstehe ich den Leistungsunterschied nicht.

+2

Gibt die erste Abfrage nicht eine einzelne Zahl zurück, während die zweite Abfrage möglicherweise Tausende (oder * Millionen? *) Knoten zurückgibt? –

+0

Sie sollten die zweite Abfrage von einem Treiber ausführen oder am Ende LIMIT 100 hinzufügen. –

Antwort

1

Ihre erste Abfrage gibt nur die Anzahl der verschiedenen Werte zurück, was für neo4j ein einfacher Job ist.

Während Ihre zweite Abfrage alle Knoten zurückgibt, die unterschiedlich sind, wenn Ihre Datenbank zu viele verschiedene Werte hat, würde es eine lange Zeit dauern. Wenn Sie nur einen Blick auf ein paar verschiedene Werte werfen möchten, können Sie eine limit zu Ihrer Abfrage hinzufügen.

ZB:

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User) 
return distinct u 
limit 5; 

Es gibt (random) fünf Benutzer, die das Element ('001') like.

+0

Jetzt verstehe ich. Anstatt jedoch eindeutige Zählungen aufzulisten, besteht meine Aufgabe darin, alle eindeutigen Benutzer aufzulisten und sie für den Prozess zu speichern. Bedeutet es, dass ich warten muss, bis die Abfrage beendet ist? Gibt es alternative effizientere Möglichkeiten? Vielen Dank! – Idealist

+0

Dies könnte helfen: [Query Tuning] (http://neo4j.com/blog/neo4j-2-2-query-tuning/) –