[英]Neo4j how to get (DISTINCT) all nodes and relationships with at least one node in common?
我最近一直在試驗 neo4j 和 cypher 但我不太能正確獲得以下查詢。 我想退回與給定員工共享至少一個項目的所有員工以及他們從事的項目。 如果用一個例子來描述可能會更簡單:
上圖中輸入為員工 1 的期望結果是:
員工 | 項目 |
---|---|
0 | 一個 |
1 | 一個 |
1 | 乙 |
4 | 一個 |
我嘗試了以下查詢,但它返回重復的關系:
MATCH (a0:Employee {name:1})-[:WORKS]->(b0:Project)
MATCH (b0)<-[:WORKS]-(a:Employee)
MATCH (a)-[:WORKS]->(b:Project)
RETURN a.name AS employee, b.name AS project
ORDER BY employee, project
員工 | 項目 |
---|---|
0 | 一個 |
1 | 一個 |
1 | 一個 |
1 | 乙 |
1 | 乙 |
4 | 一個 |
預先感謝您的幫助。
注意:這些查詢可用於創建上面的圖表
CREATE (:Employee {name: 0}),
(:Employee {name: 1}),
(:Employee {name: 2}),
(:Employee {name: 3}),
(:Employee {name: 4}),
(:Project {name: 'A'}),
(:Project {name: 'B'}),
(:Project {name: 'C'})
MATCH (e:Employee), (p:Project) WHERE e.name=0 AND p.name='A' CREATE (e)-[:WORKS]->(p)
MATCH (e:Employee), (p:Project) WHERE e.name=1 AND p.name='A' CREATE (e)-[:WORKS]->(p)
MATCH (e:Employee), (p:Project) WHERE e.name=1 AND p.name='B' CREATE (e)-[:WORKS]->(p)
MATCH (e:Employee), (p:Project) WHERE e.name=4 AND p.name='A' CREATE (e)-[:WORKS]->(p)
MATCH (e:Employee), (p:Project) WHERE e.name=3 AND p.name='C' CREATE (e)-[:WORKS]->(p)
經過幾個小時的努力,我找到了解決方案。 我不確定它是否有效。 在某種程度上,答案已經在問題中了——DISTINCT。 這個查詢完成了這項工作:
MATCH (a0:Employee {name:0})-[:WORKS]->(b0:Project)
MATCH (b0)<-[:WORKS]-(a:Employee)
WITH DISTINCT(a)
MATCH (a)-[:WORKS]->(b:Project)
RETURN a.name AS employee, b.name AS project
ORDER BY employee, project
您似乎想要這個問題的答案:給定某個員工從事的項目,找到從事這些項目的所有員工。
您可以通過一個簡單的查詢來回答這個問題:
MATCH (:Employee {name:1})-[:WORKS]->(b:Project)
MATCH (a:Employee)-[:WORKS]->(b)
RETURN a.name AS employee, b.name AS project
ORDER BY employee, project
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.