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

控制OrientDB中的边缘多重性和方向,是否可以改进?,orientdb,Orientdb,似乎有一种方法可以通过边约束来控制ODB中边的多重性 (朝底部) 边缘约束是使ODB变得不那么用户友好的可用性因素之一 以下是一些取自《泰坦手册》的多样性类型(因为它们的解释方式很容易理解): 多重:允许在任意一对标签之间具有同一标签的多条边 顶点。换句话说,该图是一个关于 这样的边缘标签。边的多重性没有约束 简单:在任何一对顶点之间最多允许这样的标签的一条边。在里面 换句话说,该图是关于标签的简单图。 确保给定标签和顶点对的边是唯一的 ManyOne:允许在任何顶点上最多有一条此类标签的输出边

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

(朝底部)

边缘约束是使ODB变得不那么用户友好的可用性因素之一

以下是一些取自《泰坦手册》的多样性类型(因为它们的解释方式很容易理解):

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

简单:在任何一对顶点之间最多允许这样的标签的一条边。在里面 换句话说,该图是关于标签的简单图。 确保给定标签和顶点对的边是唯一的

ManyOne:允许在任何顶点上最多有一条此类标签的输出边 在图形中,但不在传入边上放置约束。边缘 标签母亲是一个例子,因为每个 一个人最多有一个母亲,但母亲可以有多个孩子

ONE2MANY:允许在任何顶点上最多有一条此类标签的传入边 在图形中,但不在输出边上放置约束。边缘 标签winnerOf是一个例子,自每个 比赛最多由一个人获胜,但一个人可以赢得多个 比赛

One2OOne:最多允许一个传入和一个传出边缘 在图中任何顶点上的这种标签。与之结合的边缘标签是 一个人结婚后的一个例子 正好是另外一个人

不用说,由于这种抽象,在Titan中创建边的同时实现这种多样性是相当直接和简单的。在ODB中,它不是那么透明或简单。这与所讨论的所要求的可用性抽象是一致的

让我们来看看ODB是如何做到的(根据我对ODB的理解,ODB不太好,所以我可能错了。如果我错了,请纠正我!)

MULTI

这是ODB中的标准重量级边缘。因此,创建重权重边会自动遵循多重性规则

简单

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

manyOne

我相信这可以通过内外约束来实现

ONE2MANY

同上

ONE2ONE

通过唯一约束可用

所以,通过这个练习,我想我已经了解到ODB可以覆盖所有的多样性场景,尽管我绝对不确定。为什么我必须不确定?使用Titan使用的相同术语可以简化整个概念。看来抽象是必要的。我相信这会使ODB更容易理解

也许这些建议值得考虑

创建边类保持不变

orientdb> CREATE CLASS Owns EXTENDS E
orientdb> CREATE CLASS Lives EXTENDS E
简单(一个标准的轻量级边缘,但自动允许多个轻量级边缘,这似乎比TItan高一步!)

多重(创建具有属性的边/垂荡重量边,强制输入和输出)

很多人(不确定进出这里需要发生什么)

ONE2MANY(同上,不确定输入和输出需要发生什么)

ONE2ONE(这是一条重边,具有自动唯一约束)

唯一(附加约束,仅适用于较轻的边)

老实说,当涉及到边缘方向约束或多重性时,我真的不确定这是否涵盖了所有需要或想要的可能性。然而,我知道一个事实,上面提到的SQL对我来说更容易理解,这是像SQL这样的声明性语言的目标。在我看来,我们正在抽象出三件事。边类型创建(轻或重)、边方向和多重性

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

如果您对此有任何其他想法,并对我的想法进行更正,我们将不胜感激


斯科特

我在ODB谷歌集团有一份工作


斯科特很有趣。我来到这里的时候脑子里也有同样的例子。我使用Titan有一段时间了,并且很喜欢使用诸如基数和多重性之类的模式约束。看起来OrientDB在短期内不会实现类似的功能。Google Group链接中详细介绍的独特索引示例应该有效地以同样的方式工作,但是它有点乏味,更难管理。在重读了我当时写的内容和我现在所知道的之后,我可以看到我自己的改进建议并不完全是应该的。例如,“多重”不应表示法线边。不过,我确实认为边缘配置应该更容易。
orientdb> CREATE EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Car )
orientdb> CREATE MULTI EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Car )
orientdb> CREATE MANY2ONE EDGE Lives FROM ( SELECT FROM Country ) TO ( SELECT FROM Person )
orientdb> CREATE ONE2MANY EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Cars )
orientdb> CREATE ONE2ONE EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Cars )
orientdb> CREATE UNIQUE EDGE Owns FROM ( SELECT FROM Person ) TO ( SELECT FROM Car )