如何在 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()
这里我有一些问题:
- 在real-time流中,我需要查询是否已经有一个id的顶点
在那里,所以我需要查询历史数据的节点,所以可以
has(T.id, event['Id'])
做这个?或者我应该只使用
has(id, event['Id'])
还是 has("id", event['Id'])
?
- 我用的是
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'])
。
我想创建一个海王星数据库,并将数据转储到它。我将历史数据从 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()
这里我有一些问题:
- 在real-time流中,我需要查询是否已经有一个id的顶点
在那里,所以我需要查询历史数据的节点,所以可以
has(T.id, event['Id'])
做这个?或者我应该只使用has(id, event['Id'])
还是has("id", event['Id'])
? - 我用的是
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'])
。