我知道 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知道b和b知道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。在我看来很糟糕。不适合你?这有意义吗?
从根本上说,它归结为 Neo4j 中数据如何存储在磁盘上的内部结构——请注意 O'Reilly Neo4j 电子书的第 6 章。
在关系的数据结构中,它们有一个“firstNode”和一个“secondNode”,其中每个都是关系的左侧或右侧。
将关系标记为单向/双向将需要每个节点额外的位,我认为最好在数据存储中保留方向并在查询期间忽略方向。
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |