Neo4j 如何获取(DISTINCT)所有节点和至少有一个节点的关系?
Neo4j how to get (DISTINCT) all nodes and relationships with at least one node in common?
我最近一直在尝试使用 neo4j 和 cypher,但我不太能正确地获得以下查询。我想 return 与给定员工共享至少一个项目的所有员工以及他们从事的项目。举个例子可能更简单:
对于输入为员工 1 的上图,期望的结果是:
Employee
Project
0
A
1
A
1
B
4
A
我尝试了以下查询,但它 return 存在重复关系:
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
Employee
Project
0
A
1
A
1
A
1
B
1
B
4
A
预先感谢您的帮助。
注意:这些查询可用于创建上图
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)
经过几个小时的努力,我找到了解决方案。我不确定它是否有效。在某种程度上,答案已经在问题中 - 不同。此查询完成工作:
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
我最近一直在尝试使用 neo4j 和 cypher,但我不太能正确地获得以下查询。我想 return 与给定员工共享至少一个项目的所有员工以及他们从事的项目。举个例子可能更简单:
对于输入为员工 1 的上图,期望的结果是:
Employee | Project |
---|---|
0 | A |
1 | A |
1 | B |
4 | A |
我尝试了以下查询,但它 return 存在重复关系:
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
Employee | Project |
---|---|
0 | A |
1 | A |
1 | A |
1 | B |
1 | B |
4 | A |
预先感谢您的帮助。
注意:这些查询可用于创建上图
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)
经过几个小时的努力,我找到了解决方案。我不确定它是否有效。在某种程度上,答案已经在问题中 - 不同。此查询完成工作:
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