2016-04-01 17 views
0

Kullanıcıların bir gönderiye sahip olabileceğini düşündüğüm bir grafik var, ayrıca bir gönderiye sahip bir arkadaşınız olabilir, arkadaş takip edilebilir veya olmayabilir.
Kullanıcıların ve takip ettiği arkadaşların tüm yayınlarını nasıl sorgulayabilirim?
Bu çalıştı:Java Neo4j Cypher Veya Maç

" 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"; 

ama bu sorgu, çiftleri döndürür bizim kullanıcı ve bir arkadaşım var diyelim.
frien bir gönderiye sahip ve kullanıcı iki, sorgu her MATCH için iki kez onun bir kez gönderir, sorgu da OPSİYONEL MATCH OPTIONAL MATCH sonucu döner.

exaplain ilerletmek için: (: Post) yineleme olmadan bu ilişkileri karşılamak ve tercihen tek sorgu ile

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

Bunlar ne tüm istediğim mesaj olduğunu mevcut ilişkilerdir.

+0

neden aşağı oy? –

cevap

0

Öncelikle, sorgunuz olması gerekenden çok daha karmaşıktır. Bu daha basit sorgu eşdeğer olmalıdır. {user}'un parameter olarak verildiğini varsayalım. senin RETURN fıkra birlikte u1 ve u2 ilişkin değerler döndürmesi nedeniyle

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; 

aynı p2 değerlerle birden fazla satır olsun nedenidir. N u1/p1 sonuçları ve M u2/p2 sonuçları varsa, N*M sonuç satırları alırsınız.

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; 

Her sonuç satırında ilgili her arkadaş için verilerle bir friends koleksiyona sahip olacaktır:

bu sorguyla gibi bir şey kullanabilirsiniz ( u1/p2 sonucu başına bir satırla) N satırlarla bir sonuç elde etmek için .

+0

cevabınız için teşekkürler, ama ben http://stackoverflow.com/questions/31554217/issue-of-casting-node-neo4j didnt help çözümünde denedim koleksiyonu üzerinde yineleyemiyorum, hala hata scala olsun .collection.convert.Wrappers $ MapWrapper, org.neo4j.graphdb.Node –

+0

'a dönüştürülemez Bu SO sorusu koleksiyon için uygun değildir. Sadece düğümleri içeren bir sütun üzerinde yinelemeye çalışmamalısınız. Ve sonuçların üzerinde yineleme yapamamak gerçekten ayrı bir sorundur. Yeni bir soru oluşturmalısınız. – cybersam

+0

Onları kullanarak bunları yinelemeyi başardım: [code] \t \t scala.collection.convert.Wrappers.IteratorWrapper it = ((SeqWrapper) row.get ("arkadaşlar")) iterator(); \t \t while (it.hasNext()) { \t \t \t MapWrapper m = (MapWrapper) it.next(); \t \t Node n = (Düğüm) m.get ("p2"); için \t \t \t (Dize tuşu: n.getPropertyKeys()) { \t \t \t \t \t \t \t \t System.out.println ("Anahtar:" + tuşu + "Değer:" + n.getProperty (anahtar)); \t \t \t} \t \t} [/ code] soru şu: scala.collection.convert.Wrappers paketi her java yüklemesinde yer alıyor mu? –