OrientDB使用Schema和Graphs

使用Schema和Graphs

OrientDB是一个“关于类固醇”的图形数据库,因为它支持从文档数据库和面向对象的世界中获取的概念。本教程步骤显示了与模式和约束结合使用的Graph的强大功能。

看一下这个用例:创建一个图来映射Person和Cars之间的关系。

让我们打开一个shell(或Windows中的命令提示符)并启动OrientDB控制台(console.bat在Windows上使用):

> cd $ORIENTDB_HOME/bin
> ./console.sh

现在我们将使用控制台创建一个全新的本地数据库:

orientdb> create database plocal:../databases/cars admin admin plocal

好的,现在让我们创建第一个图形模式,其中“Person”和“Car”为2个新的Vertex类型,“Owns”为Edge类型:

orientdb> create class Person extends V
orientdb> create class Car extends V
orientdb> create class Owns extends E

然后让我们用第一个Graph元素填充数据库:

orientdb> create vertex Person set name = 'Luca'

Created vertex 'Person#11:0{name:Luca} v1' in 0,012000 sec(s).

orientdb> create vertex Car set name = 'Ferrari Modena'

Created vertex 'Car#12:0{name:Ferrari Modena} v1' in 0,001000 sec(s).

orientdb> create edge Owns from (select from Person) to (select from Car)

Created edge '[e[#11:0->#12:0][#11:0-Owns->#12:0]]' in 0,005000 sec(s).

好的,现在我们可以遍历顶点了。例如,卢卡的车是什么?从Luca顶点到“Owns”关系后的传出顶点:

orientdb> select name from ( select expand( out('Owns') ) from Person where name = 'Luca' )

----+-----+--------------
#   |@RID |name
----+-----+--------------
0   |#-2:1|Ferrari Modena
----+-----+--------------

完善。现在我们想拥有每个人的位置。我们需要另一个名为“Country”的Vertex类型来连接到具有新“Lives”Edge类型的Person:

orientdb> create class Country extends V
orientdb> create class Lives extends E

orientdb> create vertex Country set name = 'UK'

Created vertex 'Country#14:0{name:UK} v1' in 0,004000 sec(s).

接下来,让我们将Luca与英国国家联系起来:

orientdb> create edge Lives from (select from Person) to (select from Country)

Created edge '[e[#11:0->#14:0][#11:0-Lives->#14:0]]' in 0,006000 sec(s).

到现在为止还挺好。我们的图表已经扩展。现在,尝试搜索我们数据库中有“法拉利”汽车的国家/地区。

orientdb> select name from ( select expand( in('Owns').out('Lives') ) from Car where name like '%Ferrari%' )

----+-----+----
#   |@RID |name
----+-----+----
0   |#-2:1|UK
----+-----+----

设置边缘约束

现在我们使用没有任何约束的模式对我们的图形进行建模。但是要求Owns关系仅存在于Person和Car顶点之间是有用的。那么,让我们创建这些约束:

orientdb> create property Owns.out LINK Person
orientdb> create property Owns.in LINK Car

MANDATORY针对属性的设置会阻止OrientDB使用轻量级边缘(不会创建物理文档)。一定要注意,不要在它们之间放置空格MANDATORY=true

orientdb> alter property Owns.out MANDATORY=true;
orientdb> alter property Owns.in MANDATORY=true;

如果我们想要禁止Person顶点对同一个Car顶点有2条边,我们必须为out和in属性定义一个UNIQUE索引。

orientdb> create index UniqueOwns on Owns(out,in) unique

Created index successfully with 0 entries in 0,023000 sec(s).

不幸的是,索引告诉我们0个条目被索引。为什么?我们已经创建了“Luca”和“Ferrari Modena”之间的Owns关系。在这种情况下,在我们设置规则以强制为Owns实例创建文档之前,OrientDB已经创建了一个轻量级边缘。因此,您需要删除并重新创建边缘。

orientdb> delete edge from #11:0 to #12:0
orientdb> create edge Owns from (select from Person) to (select from Car)

现在检查记录是否已创建。

orientdb> select from Owns

----+-----+-----+-----
#   |@RID |out  |in
----+-----+-----+-----
0   |#13:0|#11:0|#12:0
----+-----+-----+-----

到现在为止还挺好。约束有效。现在尝试在Luca和UK(Country vertex)之间创建一个“Owns”边缘:

orientdb> create edge Owns from (select from Person) to (select from Country)

Error: com.orientechnologies.orient.core.exception.OCommandExecutionException: Error on execution of command: sql.create edge Owns from (select from Person) to (sel...
Error: com.orientechnologies.orient.core.exception.OValidationException: The field 'Owns.in' has been declared as LINK of type 'Car' but the value is the document #14:0 of class 'Country'

现在我们有一个带约束的类型图。

有关更多信息,请查看Graph Schema

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值