2016-07-10 7 views
1

Ich habe zwei Abfragen.neo4j wie man mit zwei übereinstimmen

erste Abfrage ist

match (user)-[r:CreatesChat]-(chatitems) 

zweite Abfrage

match (chatitems)-[r:PartOf]-(teamschat)-[s:OwnedBy]-() 

ist ich die ersten 3 Benutzer von der ersten Abfrage

Und zurückzukehren, die ersten drei Teams aus der zweiten zurückkehren wollen Abfrage

Ziel ist es, zu überprüfen, ob Benutzer von der ersten Abfrage die Teams von se haben cond Abfrage

Meine Neo4j Abfrage ist

match (user)-[r:CreatesChat]-(chatitems) 
with user.id as uid,chatitems.id as chatid 
order by uid desc 
with collect([uid])[..3] as users,collect([chatid])[..3] as chats 
UNWIND users AS idusers 
match (chatitems)-[r:PartOf]-(teamschat)-[s:OwnedBy]-() 
return idusers 

Diese Abfrage Rückkehr

Retour 133.239 Zeilen in 1360 ms, Anzeigen ersten 1000 Zeilen

Aber ich ausführen, um die Abfrage

match (user)-[r:CreatesChat]-(chatitems) 
with user.id as uid,chatitems.id as chatid 
order by uid desc 
with collect([uid])[..3] as users,collect([chatid])[..3] as chats 
UNWIND users AS idusers 
return idusers 

IDusers retu rned sind richtig

Zurückgegeben 3 Zeilen in 539 ms.

Wie kann ich diese beiden Abfragen beziehen?

+0

Können Sie Ihre Absicht, im Hinblick auf den zweiten Teil Ihre Abfrage mit Teams klären? Versuchen Sie, die Top-3-Teams in einer bestimmten Reihenfolge zu erreichen und festzustellen, ob sich einige der Benutzer Ihrer ersten Abfrage darin befinden? Oder versuchen Sie zu sehen, ob die 3 Benutzer Ihrer ersten Abfrage ein Team besitzen? Oder wenn sie im selben Team sind? Ein besserer Ausdruck dessen, was Sie versuchen, kann uns helfen, genauere Antworten zu geben. – InverseFalcon

+0

Ich möchte Top-3-Teams in der Reihenfolge und sehen, ob einer der Benutzer in ihnen bin – user3712581

Antwort

1

Ich denke, Sie möchten sowohl die Top 3 Benutzer und die Top 3 Teams sammeln und dann über jede Sammlung entspannen. So etwas wie das:

MATCH (user:User)-[:CreatesChat]->(chatitems:Chat) 
WITH user ORDER BY user.id DESC LIMIT 3 
WITH collect(user) AS users 
MATCH (chatitems:Item)-[:PartOf]->(teamsChat:Team)-[:OwnedBy]-() 
WITH users, teamsChat ORDER BY teamsChat.id DESC LIMIT 3 
WITH users, collect(teamsChat) AS teams 
UNWIND users AS user 
UNWIND teams AS team 
MATCH p=(chatitems:Item)-[:PartOf]-(team)-[:OwndedBy]-(user) 
RETURN p 
+0

Ich bin eher verwirrt durch Ihre Verwendung von Collect() und entspannen Sie hier, vor allem, wo Sie teamsChat als Teams sammeln und sofort abwickeln. Genauso haben Sie Benutzer gesammelt, nichts getan, aber mit WITH weitergegeben und dann abgewickelt. Fehle mir hier etwas Wichtiges, was UNWIND macht? Oder gibt es einen Grund dafür, dass die Weitergabe von übereinstimmenden Zeilen verpönt ist? Erhalten Sie nicht die gleiche Antwort, wenn Sie das Sammeln und Abwickeln entfernen? – InverseFalcon

+0

Ugh. Okay, ich denke ich sehe das Problem. Wenn wir einfach die Zeilen weiterleiten, stimmen sie mit den anderen Teilen im WITH überein und werden von LIMIT beeinflusst, anstatt unabhängig davon zu sein. Um also die begrenzten Zeilen eines Teils der Abfrage zu erhalten, müssen wir sie im späteren Teil der Abfrage vor dem Limit schützen, indem wir sie sammeln und abwickeln. Irgendwelche anderen Situationen wie diese zu beachten? Gibt es noch andere Möglichkeiten, die Reihenfolge zu begrenzen und Vorgänge zu begrenzen, so dass wir vorherige Ergebnisse ohne Änderung weitergeben können? Was ist der Grund für das Sammeln von Teams, denn hier gibt es keine Grenze? – InverseFalcon

+1

Ja, das stimmt. Es gibt eine Erklärung von limit + collect in diesem [post] (https://neo4j.com/blog/common-confusions-cypher/). Ich denke du hast recht mit den zweiten Collect/Unwind Teams, wahrscheinlich ist das nicht nötig, aber ich denke es hilft dir, explizit zu zeigen, was vor sich geht. –