为什么 neo4j 在创建时不允许非定向或双向关系?

Bru*_*res 3 neo4j cypher

我知道 Neo4j 在创建时需要一个关系方向,但允许在查询时忽略这个方向。通过这种方式,我可以查询我的图形而忽略关系方向。

我还知道,对于关系自然是双向或非定向的情况,有一些解决方法,如此处所述

我的问题是:为什么以这种方式实施?有充分的理由在创建时不允许非定向或双向关系吗?这是数据库架构的限制吗?

不允许使用如下 Cypher 语句:

CREATE ()-[:KNOWS]-()
CREATE ()<-[:KNOWS]->()
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了答案,但没有找到太多答案。例如,这个 github 问题

必须为没有关系的人定义关系方向,这很奇怪。在我看来,我正在损害我的图表的语义。

编辑 1:

澄清我对“语义问题”的立场(也许这个词是错误的):

假设我运行这个简单的CREATE语句:

CREATE (a:Person {name:'a'})-[:KNOWS]->(b:Person {name:'b'})
Run Code Online (Sandbox Code Playgroud)

结果我有这个非常简单的图表:

简单图形

:KNOWS关系有一个方向,只是因为Neo4j的要求在创建时的关系方向。在我的领域a知道bb知道a

现在,一个新的团队成员将使用这个 Cypher 查询来查询我的图表:

MATCH path = (a:Person {name:'a'})-[:KNOWS]-(b:Person {name:'b'})
return path
Run Code Online (Sandbox Code Playgroud)

这个新的团队成员不知道,当我创建这个图时,我认为这种:KNOWS关系是没有方向的。他将看到的结果是一样的:

简单图形

根据结果​​,这个新团队成员可以认为只有 Person a 考虑知道 Person b。在我看来很糟糕。不适合你?这有意义吗?

kwa*_*wah 6

从根本上说,它归结为 Neo4j 中数据如何存储在磁盘上的内部结构——请注意 O'Reilly Neo4j 电子书的第 6 章。

在关系的数据结构中,它们有一个“firstNode”和一个“secondNode”,其中每个都是关系的左侧或右侧。

将关系标记为单向/双向将需要每个节点额外的位,我认为最好在数据存储中保留方向并在查询期间忽略方向。