图的使用规范

OrientDB通过图API,相对于传统的图数据库,提供了一些额外的特征, 它支持很多来自于文档数据库和面向对象世界的概念。例如,模式和约束的使用。

案例: 车的数据库

例如,表示人和车之间的关系的图数据库。首先,创建顶点类PersonCar,边类Owns连接两者:

orientdb> CREATE CLASS Person EXTENDS V

orientdb> CREATE CLASS Car EXTENDS V

orientdb> CREATE CLASS Owns EXTENDS E

下面添加记录:

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的车?你可以从顶点Luca顺着Owns关系遍历出度顶点。

orientdb> SELECT EXPAND( OUT('Owns')) FROM Person WHERE name='Luca'

----+-----+------+--------------+--------
#   |@RID |@CLASS|name          |in_Owns
----+-----+------+--------------+--------
0   |#12:0|Car   |Ferrari Modena|[size=1]
----+-----+------+--------------+--------

上面的例子,返回Luca拥有一个Ferrari Modena。现在添加每个人的住址。

添加一个位置顶点

考虑一种场景,你想保存每个人的居住国家。实际上有很多原因来获取这个信息,例如宣传材料或者在一个更大的库中分析住址和车购买的关系。

先创建国家的顶点和居住的边。

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).


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).

查询Ferrari拥有者的国家。

orientdb> SELECT name FROM ( SELECT EXPAND( IN('Owns').OUT('Lives') )
          FROM Car WHERE name LIKE '%Ferrari%' )

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

在边上使用inout约束

上面,创建图的时候,没有任何约束。增加一些约束是必要的,例如Owns 只能在订单Person和顶点Car之间。

orientdb> CREATE PROPERTY Owns.out LINK Person

orientdb> CREATE PROPERTY Owns.in LINK Car

这些命令关联出度顶点为Person类到入度顶点Car类。也就是说,这个数据库中人可以拥有车,车不能拥有人。

在边上使用MANDATORY约束

默认的,OrientDB创建边,没有属性,有可能会创建为轻量级边。使用MANDATORY设置,可以强制使用标准边创建, 不需要额外的在数据库级别禁止轻量级的边。

orientdb> ALTER PROPERTY Owns.out MANDATORY=TRUE
orientdb> ALTER PROPERTY Owns.in MANDATORY=TRUE

使用边的UNIQUE约束

如果你想让一个人一次只能拥有一辆车。你可以使用UNIQUE索引加在边上。

orientdb> CREATE INDEX UniqueOwns ON Owns(out,in) UNIQUE

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

执行如下命令,会爆出类型不匹配:

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)...
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'

这表明约束生效了。

更多信息,参考图的规范.