簡體   English   中英

如何在 python 中實現這一點:檢查頂點是否存在,如果不存在,則創建一個新頂點

[英]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()

在這里我有一些問題:

  1. 在實時流中,我需要查詢是否已經有一個id的頂點,所以我需要查詢歷史數據的節點,那么has(T.id, event['Id'])可以這樣做嗎? 還是我應該只使用has(id, event['Id'])has("id", event['Id'])
  2. 我使用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")

前兩個將返回相同的結果,因為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'])

正如 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM