2016-06-25 15 views
0

Ich bin relativ neu zu Neo4j, also entschuldige ich mich, wenn es eine offensichtliche Antwort auf diese Frage gibt. Ich habe eine Datenbank mit Benutzerknoten, Account-Knoten und ASSIGNED_TO-Beziehungen zwischen ihnen. Ich habe eine Abfrage (unten), um die Benutzer und die zugewiesenen Konten zu erhalten, aber ich möchte auch eine Anzahl der Benutzer erhalten, die in derselben Abfrage gefunden wurden, unabhängig vom LIMIT/SKIP-Ergebnis. Was scheinbar geschieht, ist, dass die Benutzeranzahl auf dem OPTIONAL MATCH-Ergebnis basiert, nicht auf dem Ergebnis der MATCH-Abfrage.Neo4j Get Nodes und Node Anzahl gleichzeitig

Ich habe 3 Benutzer und 3 Konten in der Datenbank mit 2 Benutzern, die 2 Konten zugewiesen sind und einem Benutzer, der nur einem Konto zugewiesen ist.

Dies ist die Abfrage:

 
    MATCH (user:User) 
    WITH user 
    OPTIONAL MATCH (user)-[assigned:ASSIGNED_TO]-(account:Account) 
    RETURN user, count(user) as userCount, collect(account) as accounts 
    SKIP 0 LIMIT 25 

Dies ist das Ergebnis:

 
    user  userCount accounts 
    {id: 2} 1   [{id: 2}] 
    {id: 1} 2   [{id: 2}, {id: 1}] 
    {id: 3} 2   [{id: 1}, {id: 3}] 

ich der Usercount Wert will 3 für alle Zeilen sein. Wenn ich 'count (user)' in 'count (DISTINCT user)' ändere, bekomme ich 1 für userCount. Ich möchte vermeiden, 2 getrennte Abfragen wenn möglich auszuführen.

Antwort

2

sollte ein collect-Abroller Paar die

MATCH (user:User) 
WITH collect(user) as users, count(DISTINCT user) as userCount 
UNWIND users as user 
OPTIONAL MATCH (user)-[assigned:ASSIGNED_TO]-(account:Account) 
RETURN user, userCount, collect(account) as accounts 
SKIP 0 LIMIT 25 
+0

perfekte Trick! Genau das, was ich brauchte. Vielen Dank. – Jason

+1

Sehr ineffektiv - sehen Sie sich die Abfrage im Profiler an. –

3
// Get user count 
MATCH (user:User) WITH count(user) as userCount 
// Get user 
MATCH (user:User) 
// To optimize a query, first apply the pagination 
WITH user, userCount SKIP 0 LIMIT 25 
// The other part of query 
OPTIONAL MATCH (user)-[assigned:assigned_to]-(account:Account) 
RETURN user, 
     userCount, 
     collect(distinct account) as accounts 
+0

Das war dumm von mir. Es ist in diesem Fall offensichtlich besser, sie in zwei Abfragen aufzuteilen. Gute Antwort! –

+0

Dies scheint die gleiche Anzahl an Db-Hits und Ausführungszeit zu haben. Wie ist es effektiver? Ich habe nur neo4j für ein paar Wochen verwendet, also vergib meine Unwissenheit. – Jason

+0

3.0. Wenn ich diese Antwort verwenden würde, müsste ich die WHERE-Klausel nicht für jede MATCH-Abfrage reproduzieren? – Jason