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

如何在python中实现这一点:检查顶点是否存在,如果不存在,则创建一个新顶点,python,gremlin,amazon-neptune,Python,Gremlin,Amazon Neptune,我想创建一个neptune数据库,并将数据转储到其中。我将历史数据从DynamoDB下载到S3,这些文件是csv格式的。这些csv中的标题类似于: ~id, someproperties:String, ~label 然后,我需要通过lambda实现对neptune db的实时流,在lambda函数中,我将检查一个顶点(或边)是否存在,如果存在,我将更新顶点(或边),否则我将创建一个新的顶点。 在python中,我的实现如下所示: g.V().hasLabel('Event').has(T.i

我想创建一个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()
这里我有一些问题:

  • 在实时流中,我需要查询是否已经有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')。具有(T.id,Event['id'])
    ,但出现错误 like
    无法本地NeptuneGraphTraversal.has()
    。这是两个吗 同样的事情

  • 以下是你有疑问的三个小精灵:

    g.V().has(T.id, "some-id")
    g.V().has(id, "some-id")
    g.V().has("id", "some-id")
    
    前两个将返回相同的结果,因为
    id
    T
    的成员(作为一种风格,Gremlin用户通常静态导入
    id
    ,以便以这种方式引用它,以简化操作)。最后一次遍历与前两次不同,因为作为
    字符串
    值,它引用名为“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()
    的三元形式,因为步骤签名只允许在第二个位置使用
    字符串。在那里允许
    t
    也是没有意义的,因为
    t.label
    已经由第一个参数说明,并且
    t.id
    指的是实际的图形元素标识符。如果您知道该值,那么您就不必首先指定
    t.label
    ,因为
    t.id
    已经唯一地标识了元素。您只需执行
    g.V(事件['Id'])

    我认为在三元形式中,第二个参数只能是字符串键值。对我来说,TinkerGraph也失败了。呃……看,这就是为什么你不使用名为“id”的属性键重载
    t.id
    。只会导致各种误解。修正了我的答案。谢谢开尔文