2016-04-21 93 views
0

我有3種類型的節點「項目」,「用戶」,「公司」和這些有關係如下:Neo4j的查詢沒有返回正確的結果

(u : User)-[r:HAVE_DONATED{amount}]->(p : Project) 
(c : Company)-[r:HAVE_DONATED{amount}]->(p : Project) 

兩個用戶可以是朋友,可以檢查as

(u1 : User)-[:HAS_ACCOUNT]->()-[:FRIEND]-()<-[:HAS_ACCOUNT]-(u2 : User) 

如果上述條件成立,那麼兩個用戶是朋友。

現在我必須找到所有的項目,我的朋友們已經捐贈了捐贈者和捐助者。

Match (p : Project), (u1 : User {id : {id}}) with p, u1 
Optional Match (p)<-[r:HAVE_DONATED]-(u2) with a, u1, u2, r 
where (u1)-[:HAS_ACCOUNT]->()-[:FRIEND]-()<-[:HAS_ACCOUNT]-(u2) 
with p, count(u2) as donors, sum(toInt(r.amount)) as donations 
return {id : p.id, donor : donors, donation : donations} as project 

這個查詢給了我正確的項目,但問題是捐助者和捐款是不正確的。在捐贈者和捐款中,它只計算用戶貢獻,而不是(用戶和公司)。我想結合捐贈用戶和公司。

回答

0

將帖子

,找出所有用戶的朋友都捐贈給項目,總捐贈給這些項目,你可以使用這個查詢:

MATCH (u1:User {id : {id}})-[:HAS_ACCOUNT]->()-[:FRIEND]-()<-[:HAS_ACCOUNT]-(u2:User)-[:HAVE_DONATE‌D]->(p:Project) 
MATCH (donor)-[r:HAVE_DONATED]->(p) 
WITH p, COUNT(donor) as donors, SUM(TOINT(r.amount)) AS donations 
RETURN {id: p.id, donors: donors, donations:donations} AS project; 

查詢返回咱這編號爲{id}的用戶沒有任何朋友參與任何項目。

+0

感謝您的查詢,但這個查詢存在一個小問題,在捐贈中它不會考慮到非朋友成員所做的捐贈。這將導致正確的項目,但不正確的捐贈。 MATCH(u1:User {id:{id}}) - [:HAS_ACCOUNT] - >() - [:FRIEND] - ()< - [:HAS_ACCOUNT] - (u2:User) - [r1:HAVE_DONATED] - >(p:Project) 可選匹配(c) - [r2:HAVE_DONATED] - >(p) WITH p,COUNT(c)作爲捐助者,SUM(TOINT(r2.amount))AS捐贈 RETURN {id: p.id,捐助者:捐贈者,捐款:捐贈} AS項目 – user3542450

+0

好的,我已經更新了我的答案。 – cybersam