Neo4j将自然无向的关系与自然导向的关系区分开来

时间:2017-08-16 07:32:44

标签: neo4j cypher

由于Neo4j不允许没有方向的关系。我们在某个任意方向上模拟了自然没有任何方向的关系。

(p1:Person)-[team_member_of]->(p2:Person)
(p1:Person)<-[team_member_of]<-(p3:Person)

在查询时,我想了解p1的所有团队成员。那可以做到

MATCH(p1:Person)-[team_member_of]-(Person)
WHERE id(p1) = someId

对于这种关系类型,在两个方向上进行旅行是有意义的。 还有其他关系类型说

(p1:Person)-[driver_of]->(p2:Person)
(p1:Person)<-[driver_of]-(p3:Person)

在查询时,我想知道p1的所有驱动程序。那可以做到

MATCH(p1:Person)<-[driver_of]-(Person)
WHERE id(p1) = someId

在这种情况下,我们只需要向一个方向查询。

为了区分这两个用例,我们在每个关系中添加了一个属性。说directed: true/false(这有点打败了为什么neo4j不允许没有方向的关系的目的。)

我想不出任何其他方式来确定这种关系是否真的有方向/无方向

关于如何以一种好的方式做到这一点的任何想法?

1 个答案:

答案 0 :(得分:0)

一种方法是创建一个Team节点并让Person节点具有&#34; MEMBER_OF&#34;与Team节点的关系。如果您需要针对团队存储属性,Team节点将非常有用,并且为您提供了一种方法来查找团队成员的同事(&#34; Bob&#34;),如下所示:

MATCH (p:Person {name: "Bob"})-[:MEMBER_OF]->(Team)<-[:MEMBER_OF]-(peer:Person)
RETURN peer

关系总是倾向于有一个方向,即使点对点关系通常也有一些共同的父母。