如何在python中实现这一点:检查顶点是否存在,如果不存在,则创建一个新顶点
我想创建一个neptune数据库,并将数据转储到其中。我将历史数据从DynamoDB下载到S3,这些文件是csv格式的。这些csv中的标题类似于:如何在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
~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()
这里我有一些问题:
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
。只会导致各种误解。修正了我的答案。谢谢开尔文