[英]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
Then, I need to implement real-time streaming to this neptune db through lambda, in the lambda function, I will check if one vertex(or edges) exist or not, if exist, I will update the vertex(or edges), otherwise我創建一個新的。 在 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'])
?gV().has('Event', T.id, event['Id'])
而不是gV().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")
前兩個將返回相同的結果,因為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'])
正如 Kelvin 指出的那樣,您不能將T.id
傳遞給has()
的 3 進制形式,因為步驟簽名只允許第二個 position 中的String
。 在那里允許T
也是沒有意義的,因為T.label
已經由第一個參數說明,並且T.id
指的是實際的圖形元素標識符。 如果您知道該值,那么您就不會首先指定T.label
,因為T.id
已經唯一標識了該元素。 您只需執行gV(event['Id'])
即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.