为什么neo4j不';t是否允许在创建时不存在定向或双向关系?

为什么neo4j不';t是否允许在创建时不存在定向或双向关系?,neo4j,cypher,Neo4j,Cypher,我知道Neo4j在创建时需要一个关系方向,但允许在查询时忽略这个方向。通过这种方式,我可以忽略关系方向查询我的图形 我也知道,当关系自然是双向的或没有方向性的时候,有一些变通办法 我的问题是:为什么要这样实施?有充分的理由不允许在创建时建立非定向或双向关系吗?这是数据库体系结构的限制吗 不允许使用以下Cypher语句: CREATE ()-[:KNOWS]-() CREATE ()<-[:KNOWS]->() 因此,我有一个非常简单的图表: :知道关系只有一个方向,因为Neo4j

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

我也知道,当关系自然是双向的或没有方向性的时候,有一些变通办法

我的问题是:为什么要这样实施?有充分的理由不允许在创建时建立非定向或双向关系吗?这是数据库体系结构的限制吗

不允许使用以下Cypher语句:

CREATE ()-[:KNOWS]-()
CREATE ()<-[:KNOWS]->()
因此,我有一个非常简单的图表:

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

现在,一名新的团队成员将使用此密码查询查询我的图形:

MATCH path = (a:Person {name:'a'})-[:KNOWS]-(b:Person {name:'b'})
return path
这个新的团队成员不知道,当我创建这个图时,我认为
:KNOWS
关系不是直接的。他将看到的结果是相同的:

结果,这个新的团队成员可以认为只有A人考虑知道人B。我觉得很糟糕。不适合你?这有什么意义吗

在我看来,我正在损害我的图表的语义

如果在匹配过程中不使用符号(从而将该关系视为无向/双向),我不明白为什么在创建关系期间使用的
符号会损害图形的语义

假设支持您提出的语法。现在,您将如何使用无向关系连接两个节点ab?您仍然有两个选择:

  • CREATE(a)-[:KNOWS]-(b)
  • CREATE(b)-[:KNOWS]-(a)

  • (a,b)
    总是按外观排序,即使不是按语义排序。因此,即使我们从关系声明中删除
    符号,也无法消除其中节点顺序的问题。因此,不要简单地将其视为一个问题。

    在Neo4j中,关系总是直接的

    但是如果你不关心方向,你可以在查询时忽略方向

    MATCH (p1:Person {name:"me"})-[:KNOWS]-(p2)
    RETURN p2;
    
    使用“合并”也可以在创建时取消方向

    MATCH (p1:Person {name:"me"})
    MATCH (p2:Person {name:"you"})
    MERGE (p1)-[:KNOWS]-(p2);
    

    如果它们真的传达了不同的含义,你只需要两个关系,例如:Twitter上的
    :遵循

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

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


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

    Hi@Leon!我编辑了我的问题,试图澄清我的观点!谢谢你的时间!你好"夸"!!你的回答与我的期望非常接近。我正在读这本书,并将在不久的将来阅读推荐的章节!谢谢!:)你好@Michael Hunger。谢谢你的回答!是的,我知道在查询时可以忽略这些关系。然而,我的问题更多的是关于“为什么”Neo4j在创建时需要一个方向,正如kwah所回答的。事实上,我尝试了这种语法,但似乎图形是用一个方向创建的,或者至少Neo4j浏览器是这样显示的。
    MATCH (p1:Person {name:"me"})-[:KNOWS]-(p2)
    RETURN p2;