Neo4j 双向关系

Posted

技术标签:

【中文标题】Neo4j 双向关系【英文标题】:Neo4j Bidirectional Relationship 【发布时间】:2014-07-23 12:56:01 【问题描述】:

有没有办法使用 Cypher 在 Neo4j 中创建双向关系?我希望关系是双向的,而不是在两个方向上建立两个单向关系例如:

(A)<-[FRIEND]->(B)

而不是:

(A)-[FRIEND]->(B)
(A)<-[FRIEND]-(B)

提前致谢:)

【问题讨论】:

【参考方案1】:

不,没有。 neo4j 中的所有关系都有一个方向,从给定节点开始和结束。

有少量解决方法。

首先,正如您所建议的,我们可以有两种关系,一种从 A 到 B,另一种从 B 到 A。

或者,在编写 MATCH 查询时,我们可以指定无方向匹配模式,通过使用诸如

之类的查询
MATCH (A)-[FRIEND]-(B) RETURN A, B

它不会关心A和B是朋友还是相反,并且允许我们在建立关系时任意选择一个方向。

【讨论】:

您介意稍微解释一下替代方案的优缺点吗?哪个更好,为什么? 这也是你在真正建立关系时会做的事情吗?或者你选择一个任意方向然后 @CraigBrett Cypher 不允许您CREATE 没有方向的关系。这是有道理的,因为在没有指定方向的情况下随机决定方向是错误的。 @qualebs 从 Facebook 的角度来看,第二个会更好,因为您只有一个关系,而不是两个关系,从而减少了出错和其他异常的机会。并且您可以在一种关系中存储两种数据:(1)谁是谁的朋友(当您忽略方向时)(2)谁发送了朋友请求(源节点)以及谁接受了它(目标节点)。 如果关系实际上是方向性的,即 A 负向调节 B,B 受到 C 正向调节,但关系从 C 到 B,我如何在同一个查询中返回:第 1 行:A - B 和第 2 行:C + B。关系本身具有方向性,而不仅仅是边缘【参考方案2】:

根据这篇文章:Modeling Data in Neo4j: Bidirectional Relationships

严格来说更好的选择是在任意方向上创建关系并且在查询时不指定方向:

MATCH (neo)-[:PARTNER]-(partner)

引擎能够沿任一方向穿越边缘。创建反方向边缘是不必要的,只会浪费空间和遍历时间。

【讨论】:

请注意,这仅适用于双向或根本不存在的关系类型,例如 e.g.脸书好友。但是存在单向和双向都可以存在的关系类型,例如“知道”。

以上是关于Neo4j 双向关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Neo4J 中处理队列?

neo4j-高效的原因(节点关系属性存储)

neo4j,密码关系存在,关系属性存在于where,order by和limit

Neo4J 节点与关系实体

Neo4j:删除自我关系

在将节点从 csv 创建到 neo4j 时创建关系