2016-04-01 1 views
0

Ich habe ein Diagramm, wo Benutzer einen Beitrag haben können und auch einen Freund, der einen Beitrag haben kann, kann der Freund verfolgt werden oder nicht.
Wie kann ich alle Beiträge vom Benutzer und den Freunden, denen er folgt, abfragen?
Ich versuchte dies:Java Neo4j Cypher oder Match

" MATCH (u1:User)-[:POSTED]->(p1:Post)" 
+ " WHERE u1.username =~ '"+user+"'" 
+ " OPTIONAL MATCH (u3:User)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post)," 
+ " (u3:User)-[:FRIEND_OF]->(u2:User)" 
+ " WHERE u3.username =~ '"+user+"' return u1.username, u1.name," 
         + "p1 ,u2.username, u2.name , p2"; 

aber diese Abfrage gibt Duplikate, können sagen, dass wir unsere Benutzer und einen Freund haben.
die frien haben einen Beitrag und der Benutzer haben zwei, die Abfrage gibt den Freund Beitrag zweimal wie für jede MATCH die Abfrage gibt auch das Ergebnis OPTIONAL MATCH zurück.

weiteren exaplain:

(u:User)-[:POSTED]->(p:Post) 
(u:User)-[:FRIEND_OF]->(u2:User) 
(u:User)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post) 

das sind die Beziehungen, die, was ich existieren will alle Beiträge ist (Post), die diese Beziehungen ohne Duplikate und vorzugsweise mit einzelner Abfrage erfüllen.

+0

warum unten abstimmen? –

Antwort

0

Zunächst ist Ihre Abfrage viel komplexer als es sein muss. Diese einfachere Abfrage sollte äquivalent sein. Ich nehme an, dass {user} als parameter geliefert wird.

MATCH (u1:User {username: {user}})-[:POSTED]->(p1:Post) 
OPTIONAL MATCH 
    (u1)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post), 
    (u1)-[:FRIEND_OF]->(u2) 
RETURN u1.username, u1.name, p1, u2.username, u2.name, p2; 

Der Grund, warum Sie mehrere Zeilen mit den gleichen p2 Werte zu erhalten ist, weil Ihre RETURN Klausel Werte im Zusammenhang mit u1 und u2 zusammen zurück. Wenn es N u1/p1 Ergebnisse und M u2/p2 Ergebnisse gibt, dann erhalten Sie N*M Ergebniszeilen.

Um ein Ergebnis mit N Zeilen (mit einer Zeile pro u1/p2 Ergebnis) zu erhalten, können Sie so etwas wie diese Abfrage verwenden können:

MATCH (u1:User {username: {user}})-[:POSTED]->(p1:Post) 
OPTIONAL MATCH 
    (u1)-[:FOLLOWING]->(u2:User)-[:POSTED]->(p2:Post), 
    (u1)-[:FRIEND_OF]->(u2) 
RETURN 
    u1.username, u1.name, p1, 
    COLLECT({username: u2.username, name: u2.name, p2: p2}) AS friends; 

Jede Ergebniszeile wird eine friends Sammlung mit den Daten für jeden relevanten Freund .

+0

danke für die Antwort, aber ich kann nicht über die Sammlung iterieren Ich versuchte die Lösung in http://stackoverflow.com/questions/31554217/issue-of-casting-node-neo4j hat nicht geholfen, ich bekomme immer noch die Fehler scala .collection.convert.Wrappers $ MapWrapper kann nicht in org.neo4j.graphdb.Node umgewandelt werden –

+0

Diese Frage ist nicht für die Sammlung geeignet. Sie sollten nicht versuchen, über eine Spalte zu iterieren, die nur Knoten enthält. Und nicht in der Lage zu sein, über die Ergebnisse zu iterieren, ist wirklich ein separates Problem. Sie sollten eine neue Frage erstellen. – cybersam

+0

Ich habe es geschafft, über sie zu iterieren mit: [code] \t \t scala.collection.convert.Wrappers.IteratorWrapper it = ((SeqWrapper) row.get ("Freunde")). Iterator(); \t \t während (it.hasNext()) { \t \t \t MapWrapper m = (MapWrapper) it.next(); \t \t \t Knoten n = (Knoten) m.get ("p2"); \t \t \t für (String key: n.getPropertyKeys()) { \t \t \t \t \t \t \t \t System.out.println ("Key:" + Taste + "Wert:" + n.getProperty (Schlüssel)); \t \t} \t \t} [/ code] Die Frage ist, ob scala.collection.convert.Wrappers Paket in jeder Java-Installation enthalten ist? –