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

时间:2019-10-02 20:52:46

标签: python gremlin amazon-neptune

我想创建一个neptune数据库,并将数据转储到该数据库。我将历史数据从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'])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()。这两个是     查询同一件事?

1 个答案:

答案 0 :(得分:1)

以下是您对Gremlin的三个疑问:

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

前两个将返回与idT的成员相同的结果(从风格的角度来看,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'])

正如开尔文指出的那样,您不能将T.id传递给has()的三进制形式,因为步进签名仅允许String处于第二位置。也不允许在此处使用T是因为第一个参数已经说明了T.label,并且T.id是指实际的图形元素标识符。如果您知道该值,则不必首先指定T.label,因为T.id已经唯一地标识了元素。您只需执行g.V(event['Id'])