2015-05-01 31 views
1

Neo4j中的关系/箭头不能获得多个类型/标签(请参见herehere)。我有一个边缘需要获取标签和(可能)属性的数据模型。如果我决定使用Neo4j(而不是支持标签箭头的OriendDB),我想我会有两种选择来建模两个节点A和B之间的箭头f:将Neo4j中的箭头/关系建模为节点

1)将箭头f编码为一个跨度,比如A < --f - > B,这样f也是一个节点,并且 - >和< - 是箭头。

2)编码如箭头F A - >的F - > B,使得f是再次节点和两个 - >是箭头。

虽然这似乎是在我的数据模型上添加unnecessary complexity,但如果我想使用Neo4j,目前似乎没有任何其他选项。然后,我试图看看上面的哪些编码更适合我的查询(查询是我系统的核心)。为此,我需要诉诸实例。所以,我有两个问题:

第一个问题:

第一部分)我有标注为个人和父亲节点,并在它们之间有箭似Person<-[:sr]-father-[:tr]->Person以模特是谁的父亲谁(tr是sr的父亲)。对于一个给定的人P1,我怎么能得到他所有的祖先。

part2)如果我有Person-[:sr]->father-[:tr]->Person结构代替,为建模父亲关系,如何上述相同的查询看起来像。

这回答here当父亲被认为是一个简单的关系(而不是被编码为一个节点)

第二个问题:

part1的)我已标记节点作为每个属性为p1的节点。我想查询A节点,得到那些元素p1 < 5,然后创建以下结构:对于查询结果中的每个a1,我创建qa1<-[:sr]-isA-[:tr]->a1,使得isA和qa1是节点。

part2)如果我想创建qa1-[:sr]->isA-[:tr]->qa1而不是?

当isA被认为是简单的箭头(而不是被建模为节点)时,回答此问题here

回答

3

首先,一些术语;关系没有标签,他们只有类型。是的,每种关系都有一种类型。

二,相对于造型而言,我认为方向的关系并不总是非常重要,因为使用neo4j你可以轻松地遍历它。所以A-->f-->BA<--f-->B之间的区别我认为应该完全驱动你的域的语义上有意义的东西,没有别的。所以你的选项(1)和(2)在整体复杂性上看起来与我相同,这使我想到了第3点:

你的主要选择是将一个复杂的关系变为一个节点我认为我们在这里打电话f)或保持它作为一种关系。将“关系变为节点”称为reification,我认为这是一个相当标准的做法,以适应一些建模问题。它增加了复杂性(通过简单的关系),但增加了灵活性。这是一个非常标准的工程权衡。

所有这一切说,对于你的第一个问题,我不会推荐一个中间节点。 :father是一个非常简单的关系,我不明白你为什么需要多于一个标签。因此,对于问题一,我会选择“你没有列出的选项”,而将其设为(personA)-[:father]->(personB)。更简单。你会查询该说

MATCH (personA { name: "Bob"})-[:father]->(bobsDad) RETURN bobsDad 

是的,你可以模拟这种为(personA)-[:sr]->(fatherhood)-[:tr]->(personB),但我不明白这是如何获得你多少。至于关系方向,对于性能或查询来说同样重要,只适用于任何:tr:sr应该表示的语义。

我有节点标记为A节点与属性p1为每个。我想要 查询A节点,得到那些元素p1 < 5,然后创建 以下结构:对于查询结果中的每个a1,我创建 qa1 < - [:sr] -isA - [:tr] - > a1这样isA和qa1就是节点。

那就是:

MATCH (aNode:A) 
WHERE aNode.p1 < 5 
WITH aNode 
MATCH (qa1 { label: "some qa1 node" }) 
CREATE (qa1)<-[:sr]-(isA)-[:tr]->aNode; 

注意,您需要调整标准qa1,还可以指定一些有意义的isA

如果我想创建qa1 - [:sr] - > isA - [:tr] - > qa1,那该怎么办?

修改上面的查询应该是微不足道的,只需要改变箭头的方向,同样的查询。

+0

我把'(personA) - [:father] - >(personB)'作为一个例子来看看如果我传递所有的箭头,传递闭包查询会是什么样子。所以你是对的,在这个特定的例子中,我没有得到任何额外的点。 – qartal

相关问题