2017-05-04 143 views
1

我知道Neo4j在创建时需要关系方向,但允许在查询时忽略这个方向。通过这种方式,我可以查询我的图,忽略关系方向。为什么neo4j在创建时不允许定向或双向关系?

我也知道,有一些解决方案的情况下,当关系是自然双向或不定向,like described here

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

Cypher支架之类的语句下面是不允许的:

CREATE()-[:KNOWS]-() 
CREATE()<-[:KNOWS]->() 

我在网上搜索了一个答案,但我没有找到太多。例如,this github issue

奇怪的是必须定义一个没有它的关系方向。在我看来,我伤害了我的图形的语义。

编辑1:

为了澄清我的关于 “语义问题” 的角度来看(也许术语是错误的):

假设我跑这个简单的CREATE声明:

CREATE (a:Person {name:'a'})-[:KNOWS]->(b:Person {name:'b'}) 

因为我有这个非常简单的图表:

Simple graph

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

现在,一个新的团队成员将查询这个暗号查询我的图表:

MATCH path = (a:Person {name:'a'})-[:KNOWS]-(b:Person {name:'b'}) 
return path 

这个新的团队成员不知道,当我创造了这个图我认为:KNOWS关系不针对。他会看到的结果是一样的:

Simple graph

从该结果这个新的团队成员都可以认为只有一个人知道考虑某乙。在我看来,糟糕。不适合你?这有什么意义?

回答

2

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

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

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

+0

你好@kuah!你的回答非常接近我的期望。我正在阅读这本书,并会在不久的将来阅读推荐的章节!谢谢! :) –

0

在我看来,我伤害了我的图的语义。

我不明白为什么创建关系的过程中使用的<>符号伤害你的图形的语义,如果你要匹配(因此处理这种关系作为无向/双向的过程中没有使用该符号)。

假设您支持的语法是支持的。现在你将如何连接一个无向关系两个节点ab?你仍然有两种选择:

  1. CREATE (a)-[:KNOWS]-(b)
  2. CREATE (b)-[:KNOWS]-(a)

两人(a, b)总是被外表即使没有语义有序。因此即使我们从关系声明中删除了<>符号,其中的节点顺序问题也无法消除。所以根本不要对待它是一个问题。

+0

Hi @Leon!我编辑我的问题试图澄清我的观点!谢谢你的时间! –

1

在Neo4j关系总是定向。

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

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

和MERGE一样,你也可以在创建时离开方向。

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

如果它们确实表达了不同的含义,例如: :FOLLOWS推特上。

+0

你好@Michael Hunger。感谢您的回答!是的,我明白在查询时间这些关系可以被忽略。然而,我的问题更多的是关于“为什么”Neo4j需要在创建时指示方向,正如kwah所回答的。 –