JanusGraph---Advanced Schema
2017-10-30 本文已影响95人
zlcook
Static Vertices
- 对于加载到图中后不希望被改变的顶点,应该定义为static。
- 将顶点label定义成static,那么具有该label的所有顶点在定义它的事务完成后,就不可以在改变。
mgmt = graph.openManagement()
tweet = mgmt.makeVertexLabel('tweet').setStatic().make()
mgmt.commit()
Edge and Vertex TTL
- 顶点和边可以配置time-to-live (TTL).当时间到达后就会从图中移除。
- 作用案例:对于一些临时数据,可以使用TTL。
- 支持该特性的数据库,目前其他数据库不支持。因为下面两种支持Cell级的TTL。
- Cassandra
- HBase
Edge TTL
mgmt = graph.openManagement()
visits = mgmt.makeEdgeLabel('visits').make()
mgmt.setTTL(visits, Duration.ofDays(7))
mgmt.commit()
- 同一个label标识的边具有相同TTL。
- 对边做修改(只能修改名称)后会重置TTL
- TTL可以被修改
-
修改一个边label的TTL会影响集群中所有label,但是需要时间去传递修改,所以在同一时间有可能存在相同label具有不同TTL的情况。
*需要数据库支持Cell 级TTL
Property TTL
mgmt = graph.openManagement()
sensor = mgmt.makePropertyKey('sensor').cardinality(Cardinality.LIST).dataType(Double.class).make()
mgmt.setTTL(sensor, Duration.ofDays(21))
mgmt.commit()
- 和Edge TTL一样:相同key的property具有相同TTL,修改property会重置TTL,TTL修改后要想产生全局影响需要一些时间。
*需要数据库支持Cell 级TTL
Vertex TTL
mgmt = graph.openManagement()
tweet = mgmt.makeVertexLabel('tweet').setStatic().make()
mgmt.setTTL(tweet, Duration.ofHours(36))
mgmt.commit()
- 相同label的顶点具有同样的TTL。且只有static的顶点label才可以设置TTL
- 顶点的TTL会作用到其Edge和Property,所以顶点被删除时其Edge和Property都会被删除。
- 需要数据库支持数据库级别的TTL
Multi-Properties
- JanusGraph中的属性可以定义List、Set基数,所以一个顶点可以具有多个相同key的属性。
- JanusGraph可以为属性提供注解属性。
- 案例:为作者属性添加注解属性以表明作者头衔。
mgmt = graph.openManagement()
mgmt.makePropertyKey('name').dataType(String.class).cardinality(Cardinality.LIST).make()
mgmt.commit()
v = graph.addVertex()
p1 = v.property('name', 'Dan LaRocque')
p1.property('source', 'web')
p2 = v.property('name', 'dalaro')
p2.property('source', 'github')
graph.tx().commit()
v.properties('name')
==> Iterable over all name properties
单向边
- 占用少的存储空间
- 只可以从out-going方向遍历单向边,注意不是out-vertex。
- 使用位置:正常的边都是用在2个顶点上,但是单向边out是被用在边和属性上,in被用在顶点上。
- 当单向边的in-vertexs被删除时,单向边并不会被删除,
- Note, that unidirected edges do not get automatically deleted when their in-vertices are deleted. The user must ensure that such inconsistencies do not arise or resolve them at query time by explicitly checking vertex existence in a transaction. See the discussion in Section 29.2.2, “Ghost Vertices” for more information.
mgmt = graph.openManagement()
mgmt.makeEdgeLabel('author').unidirected().make()
mgmt.commit()
user = graph.addVertex()
book = graph.addVertex()
author = graph.addVertex()
user.addE('knows', book).property('author', author)
在user到book的knows边上加了一个单向边author指向author节点,从而可以存储user的相关信息。