我想创建一个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()
这里我有一些问题:
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()
。这两个是
查询同一件事?答案 0 :(得分: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'])
正如开尔文指出的那样,您不能将T.id
传递给has()
的三进制形式,因为步进签名仅允许String
处于第二位置。也不允许在此处使用T
是因为第一个参数已经说明了T.label
,并且T.id
是指实际的图形元素标识符。如果您知道该值,则不必首先指定T.label
,因为T.id
已经唯一地标识了元素。您只需执行g.V(event['Id'])
。