2016-04-01 70 views
0

我有一個圖表用戶可以有一個職位,也可以有一個朋友有一個職位,朋友可以遵循或不。
我如何查詢用戶和他所關注的朋友的所有帖子?
我嘗試這樣做:Java Neo4j Cypher或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"; 

但這查詢返回重複的,可以說,我們有我們的用戶和朋友。
朋友有一個帖子,用戶有兩個,查詢返回朋友帖子兩次,每個MATCH查詢返回可選匹配結果

進一步exaplain:

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

除此之外不存在我想是所有帖子的關係:滿足這些關係沒有重複,最好用單查詢(POST)。

+0

爲什麼要投票? –

回答

0

首先,您的查詢比需要的複雜得多。這個更簡單的查詢應該是等價的。我認爲{user}是作爲parameter提供的。

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; 

你多行具有相同p2值的原因是因爲你的RETURN子句返回有關u1u2共同價值觀。如果有N u1/p1結果和M u2/p2結果,那麼你會得到N*M結果行。

要獲得N行的結果(每u1/p2結果一行),你可以使用這樣的查詢:

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; 

每個結果行都會有friends收集的數據對每個相關朋友。

+0

謝謝你的答案,但我不能迭代集合我嘗試在http://stackoverflow.com/questions/31554217/issue-of-casting-node-neo4j沒有幫助的解決方案,我仍然得到錯誤斯卡拉.collection.convert.Wrappers $ MapWrapper無法轉換爲org.neo4j.graphdb.Node –

+0

那麼這個問題就不適合這個集合。您不應該試圖迭代僅包含節點的列。無法迭代結果實際上是一個單獨的問題。你應該創建一個新的問題。 – cybersam

+0

我設法遍歷他們使用:[code] \t \t scala.collection.convert.Wrappers.IteratorWrapper it =((SeqWrapper)row.get(「friends」))。iterator(); (it.hasNext()){ \t \t \t MapWrapper m =(MapWrapper)it.next(); \t \t \t節點n =(節點)m.get(「p2」); \t \t \t爲(String鍵:n.getPropertyKeys()){ \t \t \t \t \t \t \t \t的System.out.println( 「鍵:」 +鍵+ 「值:」 + N。的getProperty(鍵)); \t \t \t} \t \t} [/ code]問題是如果scala.collection.convert.Wrappers軟件包包含在每個java安裝中? –