跳到内容

高级模式

本页描述了 JanusGraph 提供的一些高级 schema 定义选项。有关 JanusGraph schema 及其定义方式的常规信息,请参阅 Schema 和数据建模

静态顶点

顶点标签可以定义为静态,这意味着带有该标签的顶点不能在其创建的事务之外进行修改。

mgmt = graph.openManagement()
tweet = mgmt.makeVertexLabel('tweet').setStatic().make()
mgmt.commit()

静态顶点标签是一种控制数据生命周期的方法,在将数据加载到图后不应再进行修改时非常有用。

边和顶点 TTL

边和顶点标签可以配置存活时间 (TTL)。具有此类标签的边和顶点在初始创建后,当配置的 TTL 到期时将自动从图中删除。TTL 配置在将大量临时数据加载到图中时非常有用。定义 TTL 无需手动清理,并且非常有效地处理删除。例如,当用户页面访问等事件边在一段时间后被汇总或不再需要进行分析或操作查询处理时,使用 TTL 是有意义的。

以下存储后端支持边和顶点 TTL。

  • CQL 兼容存储后端
  • HBase
  • BerkeleyDB - 仅支持小时离散 TTL,因此最小 TTL 为一小时。

边 TTL

边 TTL 是按每条边标签定义的,这意味着该标签的所有边都具有相同的存活时间。请注意,后端必须支持单元级 TTL。目前只有 CQL、HBase 和 BerkeleyDB 支持此功能。

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

请注意,修改一条边会重置该边的 TTL。另请注意,边标签的 TTL 可以修改,但此更改传播到所有正在运行的 JanusGraph 实例可能需要一些时间,这意味着同一标签可能暂时使用两个不同的 TTL。

属性 TTL

属性 TTL 与边 TTL 非常相似,并且是按每个属性键定义的,这意味着该键的所有属性都具有相同的存活时间。请注意,后端必须支持单元级 TTL。目前只有 CQL、HBase 和 BerkeleyDB 支持此功能。

mgmt = graph.openManagement()
sensor = mgmt.makePropertyKey('sensor').cardinality(Cardinality.LIST).dataType(Double.class).make()
mgmt.setTTL(sensor, Duration.ofDays(21))
mgmt.commit()

与边 TTL 一样,修改现有属性会重置该属性的 TTL,并且修改属性键的 TTL 可能不会立即生效。

顶点 TTL

顶点 TTL 是按每个顶点标签定义的,这意味着该标签的所有顶点都具有相同的存活时间。配置的 TTL 适用于顶点、其属性以及所有相关联的边,以确保整个顶点从图中删除。因此,在设置 TTL 之前,顶点标签必须定义为静态,以排除任何可能使顶点 TTL 失效的修改。顶点 TTL 仅适用于静态顶点标签。请注意,后端必须支持存储级 TTL。目前只有 CQL、HBase 和 BerkeleyDB 支持此功能。

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

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

多重属性

正如在 Schema 和数据建模中讨论的,JanusGraph 支持具有 SET 和 LIST 基数的属性键。因此,JanusGraph 支持单个顶点上具有相同键的多个属性。此外,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
这些功能在许多应用程序中都很有用,例如那些需要将溯源信息(例如,谁添加了属性、何时何地?)附加到属性的应用程序。对高基数属性和属性上的属性注解的支持,在高并发、横向扩展设计模式中也很有用,如 最终一致性存储后端 中所述。

顶点中心索引和全局图索引对属性的支持方式与对边的支持方式相同。有关为边定义这些索引的信息,请参阅 索引以提高性能,并使用相应的 API 方法为属性定义相同的索引。

单向边

单向边是只能在出向方向遍历的边。单向边占用较少的存储空间,但其支持的遍历类型有限。单向边在概念上类似于万维网中的超链接,即出向顶点可以通过该边进行遍历,但入向顶点不知道其存在。

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

请注意,单向边在其入向顶点被删除时不会自动删除。用户必须确保不会出现此类不一致,或在查询时通过在事务中明确检查顶点是否存在来解决它们。有关更多信息,请参阅 幽灵顶点 中的讨论。