控制OrientDB中的边多重性和方向,是否可以改进?

时间:2015-10-29 16:02:18

标签: orientdb

似乎有一种方法可以通过边缘约束来控制ODB中的多边形。

http://orientdb.com/docs/last/Tutorial-Using-schema-with-graphs.html(在底部)

边缘约束是使ODB不那么用户友好的可用性之一。

以下是从Titan手册中获取的一些多重类型(因为解释它们的方式很容易理解):

  

MULTI:在任何一对之间允许相同标签的多个边   顶点。换句话说,该图是关于的多图   这样的边缘标签。边缘多重性没有约束。

     

SIMPLE:在任何一对顶点之间最多允许此类标签的一个边缘。在   换句话说,图表是关于标签的简单图表。   确保边缘对于给定标签和顶点对是唯一的。

     

MANY2ONE:在任何顶点上最多允许此标签的一个输出边缘   在图中,但没有对传入边进行约束。边缘   标签母亲是一个MANY2ONE多样性的例子   人最多只有一个母亲,但母亲可以有多个孩子。

     

ONE2MANY:在任何顶点上最多允许此标签的一个传入边缘   在图表中,但没有限制外出边缘。边缘   label winnerOf是一个具有ONE2MANY多重性的例子   比赛最多由一个人赢得,但一个人可以赢得多个   竞赛。

     

ONE2ONE:最多允许一个传入边缘和一个传出边缘   在图中的任何顶点上的这种标签。边缘标签结婚了   ONE2ONE多样性的一个例子,因为一个人已婚   正是另一个人。

毋庸置疑,由于这种抽象,在Titan中创建边缘时实现这种多样性是相当简单直接的。在ODB中,它不是那么透明或简单。这与所讨论的所请求的可用性抽象一致in this issue on Github

让我们看一下可能性,看看ODB是如何做到的(根据我对ODB的理解,这肯定不是很好,所以我可能是错的。请纠正我,如果我!)。

MULTI

这是ODB的标准重量级优势。因此,创建一个重量级边缘会自动遵循MULTI多重性规则。

SIMPLE

这似乎属于边缘的“UNIQUE”索引方法。但是,我不认为这是完全正确的,因为UNIQUE索引在两个顶点之间强制执行单个输入和输出。所以使用UNIQUE索引更像是ONE2ONE。我相信这可能相当于轻量级边缘,但增加了唯一索引。(?)

MANY2ONE

我相信这可以通过进出约束来完成。

ONE2MANY

与上述相同。

ONE2ONE

可通过UNIQUE约束。

所以,通过这个练习,我想我已经知道ODB可以涵盖所有多重性场景,但是,我绝对不确定。为什么我必须不确定?通过使用Titan使用的相同术语,可以简化整个概念。似乎抽象是必要的。我相信它会让ODB更容易理解。

也许这些建议值得考虑。 Starting from the Cars database example taken from the docs.

创建边缘类保持不变。

orientdb> CREATE CLASS Owns EXTENDS E
orientdb> CREATE CLASS Lives EXTENDS E

SIMPLE(标准的轻质边缘,但自动允许多个轻质边缘,这似乎比TItan高出一步!)

orientdb> CREATE EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Car )

MULTI(创建属性的边缘/重量边缘,必须输入和输出)

orientdb> CREATE MULTI EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Car )

MANY2ONE(不确定进出这里需要做什么)

orientdb> CREATE MANY2ONE EDGE Lives FROM ( SELECT FROM Country ) TO ( SELECT FROM Person )

ONE2MANY(与上述相同,不确定进出的情况)

orientdb> CREATE ONE2MANY EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Cars )

ONE2ONE(这是一个重量级边缘,具有自动UNIQUE约束)

orientdb> CREATE ONE2ONE EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Cars )

UNIQUE(附加约束,仅适用于轻量级边缘)

orientdb> CREATE UNIQUE EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Car )

说实话,在边缘方向限制或多重性方面,我真的不确定这涵盖了所有需要或想要的可能性。但是,我知道以上事实表明SQL对我来说更容易理解。这是像SQL这样的声明性语言的目标。在我看来,我们正在抽象出三件事。边缘类型创建(重量轻或重量重),边缘方向和多重性。

当我回顾我刚刚写的内容时,我想我不确定的是如何在ODB中实际创建多对一和一对多的边缘。

对此的任何其他想法和对我的想法的更正将不胜感激。

斯科特

1 个答案:

答案 0 :(得分:0)

我在ODB Google Group中咬了一口。

https://groups.google.com/forum/#!topic/orient-database/sZ4GjSvEKtI

斯科特