图的使用规范
OrientDB通过图API,相对于传统的图数据库,提供了一些额外的特征, 它支持很多来自于文档数据库和面向对象世界的概念。例如,模式和约束的使用。
案例: 车的数据库
例如,表示人和车之间的关系的图数据库。首先,创建顶点类Person
和Car
,边类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 |
---+-------+--------+
在边上使用in
和out
约束
上面,创建图的时候,没有任何约束。增加一些约束是必要的,例如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'
这表明约束生效了。
更多信息,参考图的规范.