Tinkerpop 多数据库通用版

Tinkerpop common version for multiple databases

总结

我正在开发一个旨在跨 tinkerpop 支持的多个图形数据库工作的应用程序

详情

根据我的研究,相同版本的 tinkerpop 库 (gremlin-python) 不适用于所有图形数据库的最新版本。这种情况的最佳方法是什么。我打算测试的数据库是

  1. JanusGraph 0.2.0 支持 gremlin-python 3.2.7
  2. NEO4J 3.3.3 支持 gremlin-python 3.3.2

我还在尝试集成更多的数据库,比如 orientDB 和 Amazon Neptune 你知道它们支持什么版本吗?

这个问题可能有点棘手,尤其是对于没有明确发布版本和功能支持的非开源系统。对于开源系统,您通常可以通过查看项目的 pom.xml 找到他们支持特定版本的 TinkerPop 版本。对于 OrientDB,这意味着找到您想要的版本(在本例中为 3.2.3.0),然后寻找 gremlin-core 依赖项:

https://github.com/orientechnologies/orientdb-gremlin/blob/3.2.3.0/driver/pom.xml#L47

版本指向 属性,因此进一步检查 pom,您会看到上面定义的数字:

https://github.com/orientechnologies/orientdb-gremlin/blob/3.2.3.0/driver/pom.xml#L14

所以OrientDB 3.2.3.0支持TinkerPop 3.2.3。对于闭源系统,您只能四处搜索,直到找到所需的答案或直接询问供应商,我猜 - 我已经看到 Neptune 在 3.3.x 上,但我不确定是什么版本"x".

仅仅因为所有这些系统都支持不同版本的 TinkerPop 并且一般建议使用匹配的 TinkerPop 版本来连接它们并不意味着您无法获得 3.3.x 驱动程序连接到基于 3.2.x 的服务器。您可能没有这样做的最佳体验,并且在这样做时需要注意一些事情,但我认为这是可以做到的。

从驱动程序的角度来看,这样做的关键是确保您对要连接的图形具有正确的序列化配置。无论您是否尝试连接到同一版本系统,都是如此。默认情况下,TinkerPop 确保同一版本中的这些配置是一致的,以便它们开箱即用。这就是为什么我们倾向于建议您尽可能使用相同的版本。如果不可能,您需要手动进行这些对齐。

例如,如果您在此 link 中向下滚动到 "Serialization" 部分,您会发现 Neptune 支持的格式:

https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

只要您将驱动程序配置为匹配其中一种格式,它就应该适合您。 JanusGraph 也是如此,与 Neptune 不同,它不支持 Gryo 或 GraphSON 3.0,因为它绑定到 3.2.x 行。序列化器的配置可以在 JanusGraph 对 Gremlin Server 的打包中找到:

https://github.com/JanusGraph/janusgraph/blob/v0.2.0/janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server.yaml#L15-L21

关于您如何配置 python 驱动程序以进行序列化?不可否认,没有太多关于它的文章。关键是在配置Client时设置message_serializer(来自gremlinpython 3.3.2):

https://github.com/apache/tinkerpop/blob/3.3.2/gremlin-python/src/main/jython/gremlin_python/driver/client.py#L44-L45

你可以看到默认设置为 GraphSON 3.0。所以,这对 Neptune 来说是完美的,但对 JanusGraph 来说不是。对于尚不支持 GraphSON 3.0 的 JanusGraph,您只需更改配置以使用 GraphSON 2.0 序列化程序:

https://github.com/apache/tinkerpop/blob/3.3.2/gremlin-python/src/main/jython/gremlin_python/driver/serializer.py#L149

所以,这只是让连接正常工作 - 然后还有其他事情需要考虑:

  1. 如果您对旧服务器使用新版本的 gremlinpython,您将需要确保了解服务器不支持的任何功能(例如,不要使用math() 从您的 3.3.x 客户端开始,因为它不能在 3.2.x 服务器上运行)
  2. CosmosDB 可能允许您连接 3.3.x,但它没有完整的 Gremlin 支持,目前不支持基于字节码的遍历 - 仅支持字符串
  3. 这些版本的 GraphSON 序列化中的许多错误已得到修复,有时某些类型可能具有修改后的序列化方案,这可能会阻止 3.3.x 与 3.2.x 通信- 我想不出任何会立即跳出的大问题,但我很确定它已经发生了 - 也许是 Tree 的序列化以及一些扩展类型。如果您 运行 遇到麻烦,您可以随时查看 GraphSON 类型的完整列表 here 并比较已发布的版本。