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

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

~id, someproperties:String, ~label

然后,我需要通过 lambda 实现对这个 neptune db 的实时流式传输,在 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. 在实时流中,我需要查询是否已经存在带有id的顶点,所以我需要查询历史数据的节点,那么可以 has(T.id, event['Id'])这样做吗?还是我应该只使用 has(id, event['Id'])or 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()。这两个查询是一样的吗?


临摹微笑
浏览 96回答 1
1回答

皈依舞

这是您对 Gremlin 有疑问的三个部分:g.V().has(T.id, "some-id")g.V().has(id, "some-id")g.V().has("id", "some-id")前两个将返回与id成员相同的结果T(作为一种风格,Gremlin 用户通常静态导入id,以便为简洁起见以这种方式引用它)。最后一次遍历与前两次不同,因为String它作为一个值引用了一个名为“id”的标准属性键。一般来说,TinkerPop 会建议您不要使用像“id”或“label”这样的属性键名,因为它可能会导致错误和混淆T.至于你的问题的第二部分围绕:g.V().has('Event', T.id, event['Id']) g.V().hasLabel('Event').has(T.id, event['Id'])正如 Kelvin 指出的那样,您不能传递T.id到 3 元形式,因为步骤签名只允许 a在第二个位置。允许那里也没有意义,因为第一个参数已经说明了它并引用了实际的图形元素标识符。如果您知道该值,那么您就不会首先指定 ,因为已经唯一标识了元素。你会做的。has()StringTT.labelT.idT.labelT.idg.V(event['Id'])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python