2016-05-23 64 views
1

的性质唯一索引我有两个顶点类V1和V2,都有财产“身份证”。 我有一个边缘类,EOrientDB两个连接的顶点

V1的id属性是唯一索引,因此,所有V1具有唯一的ID。 现在我想的是连接到一个特定的V1实例的所有V2实例都具有唯一的ID。 所以:

OK(和需要工作)

V1(id:"A") ---- E ----> V2(id:"a") 
V1(id:"A") ---- E ----> V2(id:"b") 
V1(id:"B") ---- E ----> V2(id:"a") 
V1(id:"B") ---- E ----> V2(id:"b") 

不正常

V1(id:"A") ---- E ----> V2(id:"a") 
V1(id:"A") ---- E ----> V2(id:"a") 

优选的是,作为另外,应该也有可能为没有边缘,他们存在的V2实例应该在全球范围内独一无二。如果最后一部分是不可能的,那么第一部分无论如何都是有帮助的。

这是可能的数据库配置/索引(边缘或顶点),还是我必须在应用程序中强制执行?

UPDATE

我通过配置与意思/索引的是,它是可以避免的(例外)采用独特的索引来强制时,如果你想添加的边缘(就像只有一个边缘存在于两个顶点之间)。

回答

1

我只看到2种方法来做到这一点:

  1. 把V2 id属性的边缘,并呼吁它v2id,这样你就可以创建针对out + v2id
  2. 的唯一索引创建挂钩(触发)在E类的onBeforeCreate(),并做你的支票
+0

第一个选项是唯一可能的,如果边缘是强制性的,因为id属性适用于由顶点描述的实体。由于id有不同的目的,处理也会有点麻烦。所以我想这是任何一个选项2或处理它的应用程序/查询。 (有关查询示例,请参阅下面的@AlessandroRota的答案)。我会将其标记为答案。谢谢! – dargolith

1

您可以使用

update e set out=(select from v1 where id="a"), in=(select from v2 where id="a") upsert where out=(select from v1 where id="a") and in=(select from v2 where id="a") 

希望它能帮助。

+0

这可能是有用的,谢谢。不过,我想知道是否有强制执行其更深层次的某种方式(防止以往任何时候都可以创建它们)。我的猜测是,这是不可能的?我设法通过在边和边上创建索引来创建独特的边,但是这种情况稍微复杂一些,因为它取决于边的入点和出点顶点的属性(不仅仅是顶点的顶点)。 – dargolith

+0

@dargolith我不认为这是可能 –