计算机系统应用教程网站

网站首页 > 技术文章 正文

(十三) JanusGraph 本体管理高级特性

btikc 2024-10-26 08:41:07 技术文章 10 ℃ 0 评论

Schema高级特性

静态节点(Static Vertex)

静态顶点标签是控制数据生命周期的一种方法,在将数据加载到图中时很有用,而这些数据在创建后不应修改。

gremlin> mgmt = graph.openManagement()
gremlin> angle = mgmt.makeVertexLabel('angle').setStatic().make()
gremlin> mgmt.commit()

TTL

ttl (time to live) 生存时间

边缘和顶点标签可以配置生存时间。当配置的TTL在初始创建后通过时,带有此类标签的边和顶点将自动从图中删除。当将大量数据加载到仅临时使用的图中时,TTL配置非常有用。定义TTL消除了手动清理的需要,并且可以非常有效地处理删除。例如,当TTL edges(如用户页面访问事件)在一段时间后被归档,或者根本不需要用于分析或操作查询处理时,这些边的存储将失去意义。该特性依赖于底层的后端存储是否支持TTL,存储后端支持边缘和顶点TTL:

  1. 与CQL兼容的存储后端
  2. HBase
  3. BerkeleyDB-仅支持小时离散TTL,因此最小TTL为一小时。

Edge TTL

边TTL是在每个边的基础上定义的,这意味着该edge label的所有边都有相同的生存时间。

gremlin> mgmt = graph.openManagement()
gremlin> love = mgmt.makeEdgeLabel('love').make()
gremlin> mgmt.setTTL(love, Duration.ofDays(7))
gremlin> mgmt.commit()

请注意,修改边缘会重置该边缘的TTL。还要注意,edge label的TTL可以修改,但这种更改可能需要一些时间才能传播到所有正在运行的JanusGraph实例,这意味着同一类型的label可以临时使用两个不同的TTL。

Property TTL

与edge TTL类似, 单元级TTL, 依赖后端存储

gremlin> mgmt = graph.openManagement()
gremlin> nickName = mgmt.makePropertyKey('nick_name').cardinality(Cardinality.LIST).dataType(String.class).make()
gremlin>mgmt.setTTL(nickName, Duration.ofDays(21))
gremlin> mgmt.commit()

Vertex TTL

顶点Vertex TTL是在每个Vertex label的基础上定义的,这意味着该标签的所有顶点都有相同的生存时间。配置的TTL应用于顶点、其property和所有关联边edge,以确保从图形中删除整个顶点。因此,顶点TTL仅适用于静态顶点标签。请注意,后端必须支持存储级TTL。目前只有CQL、HBase和BerkeleyDB支持这一点。

gremlin> mgmt = graph.openManagement()
gremlin> player = mgmt.makeVertexLabel('player').setStatic().make()
gremlin> mgmt.setTTL(player, Duration.ofHours(36))
gremlin> mgmt.commit()

请注意,Vertex label的TTL可以修改,但这种更改可能需要一些时间才能传播到所有正在运行的JanusGraph实例,这意味着同一标签可以临时使用两个不同的TTL。


多属性

JanusGraph支持具有SET和LIST基数的属性键。因此,JanusGraph支持在单个顶点上具有相同键的多个Property。此外,JanusGraph对Property的处理类似于edge,因为property上允许使用单值属性。

gremlin> mgmt = graph.openManagement()
gremlin> mgmt.makePropertyKey('haha').dataType(String.class).cardinality(Cardinality.LIST).make()
gremlin> mgmt.commit()
gremlin> v = graph.addVertex()
gremlin> v.property('haha', 'Dan LaRocque')
gremlin> v.property('haha', 'dalaro')
gremlin> graph.tx().commit()
gremlin> v.properties('haha')
gremlin> mgmt = graph.openManagement()
gremlin> mgmt.makePropertyKey('info').dataType(String.class).cardinality(Cardinality.LIST).make()
gremlin> mgmt.commit()
gremlin> v = graph.addVertex()
gremlin> p1 = v.property('info', 'AAAA')
gremlin> p1.property('source', 'web')
gremlin> p2 = v.property('info', 'BBBB')
gremlin> p2.property('source', 'github')
gremlin> graph.tx().commit()
gremlin> v.properties('info')


单向边Unidirected Edges

单向边是指只能在向外的方向上遍历的边。单向边缘具有较低的存储占用空间,但其支持的遍历类型有限。官方给了个比喻:单向边在概念上类似于万维网中的超链接,因为外顶点可以穿过边,但内顶点不知道它的存在。出顶点会存一分边信息,入顶点不会额外存储边信息。

从边切割角度看,节省了边二次存储的问题,这是更为重要的点。

gremlin> mgmt = graph.openManagement()
gremlin> mgmt.makeEdgeLabel('author').unidirected().make()
gremlin> mgmt.commit()

请注意,删除其内顶点时,单向边不会自动删除。用户必须确保不会出现这种不一致,或者在查询时通过显式检查事务中是否存在顶点来解决这些不一致。这一点要格外注意,这种特定其实在目前存储成本降低的情况下大家不会特别关注,但是从传输成本看是有意义在的,具体需根据使用场景来看

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表