动态图
JanusGraph 支持动态创建图。这与标准 Gremlin Server 实现允许访问图的方式有所不同。传统上,用户通过相应地配置 gremlin-server.yaml 文件,在服务器启动时创建图的绑定。例如,如果你的 yaml 文件的 graphs 部分看起来像这样
graphs {
graph1: conf/graph1.properties,
graph2: conf/graph2.properties
}
那么你将通过字符串 graph1 绑定到根据其提供的属性文件在服务器上打开的图来访问 Gremlin Server 上的图,graph2 也是如此。
然而,如果我们使用 ConfiguredGraphFactory 动态创建图,那么这些图由 JanusGraphManager 管理,图配置由 ConfigurationManagementGraph 管理。这特别有用,因为它 1. 允许你在服务器启动后定义图配置,2. 允许图配置以持久化和分布式的方式在你的 JanusGraph 集群中进行管理。
要正确使用 ConfiguredGraphFactory,你必须将集群中的每个 Gremlin Server 配置为使用 JanusGraphManager 和 ConfigurationManagementGraph。此过程的详细说明请参见此处。
图引用一致性
如果你将所有 JanusGraph 服务器配置为使用 ConfiguredGraphFactory,JanusGraph 将确保你的集群中所有 JanusGraph 节点上的所有图表示都是最新的。
例如,如果你在一个 JanusGraph 节点上更新或删除了图的配置,那么我们必须从*集群中每个 JanusGraph 节点*上的缓存中清除该图。否则,你的集群中可能会出现不一致的图表示。JanusGraph 使用消息日志队列通过问题图配置使用的后端系统自动处理此清除。
如果你的某个服务器配置不正确,则可能无法成功从缓存中删除图。
重要
对你的 TemplateConfiguration 的任何更新都不会导致先前使用所述模板配置创建的图/图配置的更新。如果你想更新单个图配置,你必须使用可用的更新 API 来进行。这些更新 API *然后*将导致集群中所有 JanusGraph 节点上的图缓存清除。
动态图和遍历绑定
JanusGraph 能够将动态创建的图及其遍历引用分别绑定到集群中所有 JanusGraph 节点上的 <graph.graphname> 和 <graph.graphname>_traversal,绑定在集群中的任何节点上生效的最大延迟为 20 秒。有关更多信息,请阅读此处。
JanusGraph 实现此功能的方式是,集群中的每个节点都会轮询 ConfigurationManagementGraph,以获取你已创建配置的所有图。然后,JanusGraphManager 将使用其持久化配置打开所述图,将其存储在其图缓存中,并将 <graph.graphname> 绑定到 GremlinExecutor 上的图引用,并将 <graph.graphname>_traversal 绑定到 GremlinExecutor 上的图遍历引用。
这允许你在 JanusGraph 集群中的每个节点上通过其字符串绑定访问动态创建的图及其遍历引用。这对于使用 Gremlin Server 客户端和使用TinkerPop 的 withRemote 功能尤其重要。
注意
要设置你的集群以绑定动态创建的图及其遍历引用,你必须将每个节点配置为使用 ConfiguredGraphFactory。
使用 TinkerPop 的 withRemote 功能
由于遍历引用绑定在 JanusGraph 服务器上,我们可以利用 TinkerPop 的 withRemote 功能。这将允许本地运行 Gremlin 查询,针对远程图引用。传统上,人们通过发送字符串脚本表示来针对远程 Gremlin 服务器运行查询,这些脚本在远程服务器上处理,并将响应序列化并发送回来。但是,TinkerPop 也允许使用 remoteGraph,如果你正在构建一个易于移植到多个实现的 TinkerPop 兼容图基础设施,这可能很有用。
要在 JanusGraph 中使用此功能,我们必须首先确保已在远程 JanusGraph 集群上创建了一个图
ConfiguredGraphFactory.create("graph1");
接下来,我们必须等待 20 秒,以确保遍历引用已绑定到远程集群中的每个 JanusGraph 节点。
最后,我们可以本地使用 withRemote 方法来访问远程图的本地引用
gremlin> cluster = Cluster.open('conf/remote-objects.yaml')
==>localhost/127.0.0.1:8182
gremlin> g = traversal().withRemote(DriverRemoteConnection.using(cluster, "graph1_traversal"))
==>graphtraversalsource[emptygraph[empty], standard]
为了完整起见,上述 conf/remote-objects.yaml 应告知 Cluster API 如何访问远程 JanusGraph 服务器;例如,它可能看起来像
hosts: [remoteaddress1.com, remoteaddress2.com]
port: 8182
username: admin
password: password
connectionPool: { enableSsl: true }
serializer:
className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1
config:
ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]