如何在 python 中实现:检查一个顶点是否存在,如果不存在,则创建一个新顶点

How to implement this in python : Check if a vertex exist, if not, create a new vertex

我想创建一个海王星数据库,并将数据转储到它。我将历史数据从 DynamoDB 下载到 S3,这些文件为 csv 格式。这些 csv 中的 header 如:

~id, someproperties:String, ~label

然后,我需要实现 real-time 通过 lambda 流式传输到这个海王星数据库,在 lambda 函数中,我将检查一个顶点(或边)是否存在,如果存在,我将更新顶点(或边),否则我创建一个新的。 在 python 中,我的实现是这样的:

g.V().hasLabel('Event').has(T.id, event['Id']).fold().coalesce(unfold(), addV('Event').property(T.id, event['Id'])).property(Cardinality.single, 'State', event['State']).property('sourceData', event['sourceData']).next()

这里我有一些问题:

  1. 在real-time流中,我需要查询是否已经有一个id的顶点 在那里,所以我需要查询历史数据的节点,所以可以 has(T.id, event['Id'])做这个?或者我应该只使用 has(id, event['Id']) 还是 has("id", event['Id'])
  2. 我用的是 g.V().has('Event', T.id, event['Id']) 而不是 g.V().hasLabel('Event').has(T.id, event['Id']),但出现错误 喜欢 cannot local NeptuneGraphTraversal.has()。这两个是 查询相同的东西?

这是您有疑问的 Gremlin 的三个部分:

g.V().has(T.id, "some-id")
g.V().has(id, "some-id")
g.V().has("id", "some-id")

前两个 return 与 id 相同的结果是 T 的成员(作为一种风格,Gremlin 用户通常静态导入 id以便为简洁起见以这种方式引用它)。最后一次遍历与前两次不同,因为作为 String 值,它引用名为 "id" 的标准 属性 键。一般来说,TinkerPop 会建议您不要使用 属性 键名,例如 "id" 或 "label",因为它可能会导致错误和混淆 T.[=26 的值=]

至于你的问题的第二部分围绕:

g.V().has('Event', T.id, event['Id']) 
g.V().hasLabel('Event').has(T.id, event['Id'])

您不能将 T.id 传递给 has() 的 3 元形式,正如 Kelvin 指出的那样,因为步骤签名只允许在第二个位置出现 String。在那里允许 T 也是没有意义的,因为 T.label 已经由第一个参数说明并且 T.id 指的是实际的图形元素标识符。如果您知道该值,那么您就不会在一开始就指定 T.label,因为 T.id 已经唯一标识了该元素。你只需做 g.V(event['Id'])