簡體   English   中英

如果不存在,則使用 gremlin 添加邊緣

[英]Add edge if not exist using gremlin

我正在使用天藍色的宇宙圖數據庫。

有誰知道是否有辦法在兩個頂點之間添加一條邊,如果它不存在(使用 gremlin 圖查詢)?

添加頂點時我可以這樣做,但不能使用邊。 我從這里開始使用代碼:

g.Inject(0).coalesce(__.V().has('id', 'idOne'), addV('User').property('id', 'idOne'))

謝謝!

可以使用邊緣。 該模式在概念上與以coalesce()為中心的頂點和中心相同。 使用“現代” TinkerPop 玩具圖來演示:

gremlin> g.V().has('person','name','vadas').as('v').
           V().has('software','name','ripple').
           coalesce(__.inE('created').where(outV().as('v')),
                    addE('created').from('v').property('weight',0.5))
==>e[13][2-created->5]

在這里,我們在“vadas”和“ripple”之間添加了一條邊,但前提是它不存在。 這里的關鍵是檢查coalesce()的第一個參數。

接受的答案的性能不是很好,因為它使用 inE(...),這是一項昂貴的操作。

這個查詢是我在 CosmosDB 中使用的:

g.E(edgeId).
fold().
coalesce(
   unfold(),
   g.V(sourceId).
   has('pk', sourcePk).
   as('source').
   V(destinationId).
   has('pk', destinationPk).
   addE(edgeLabel).
   from('source').
   property(T.id, edgeId)
)

這使用每個頂點的 id 和分區鍵進行廉價查找。

我一直在研究類似的問題,試圖避免頂點或邊的重復。 第一個是我如何檢查以確保我沒有復制頂點的粗略示例:

            "g.V().has('word', 'name', '%s').fold()"
            ".coalesce(unfold(),"
            "addV('word')" 
            ".property('name', '%s')"
            ".property('pos', '%s')"
            ".property('pk', 'pk'))"
            % (re.escape(category_),re.escape(category_), re.escape(pos_))

第二個是我可以確保在任一方向上都不是定向邊緣的方式。 我使用了兩個合並語句,一個嵌套在另一個中:

        "x = g.V().has('word', 'name', '%s').next()\n"
        "y = g.V().has('word', 'name', '%s').next()\n"
        "g.V(y).bothE('distance').has('weight', %f).fold()"
        ".coalesce("
        "unfold(),"
        "g.addE('distance').from(x).to(y).property('weight', %f)"
        ")"
        % (word_1, word_2, weight, weight)

因此,如果邊存在 y -> x,它會跳過生成另一個邊。 如果 y -> x 不存在,則它會測試以查看 x -> y 是否存在。 如果沒有,則進入創建 x -> y 的最終選項

如果這里有人知道更簡潔的解決方案,請告訴我。 我對 gremlin 還是很陌生,希望得到一個更清晰的答案。 不過,這個似乎就足夠了。

當我實現之前提供的解決方案時,當我運行我的代碼兩次時,每次嘗試都會產生一個邊緣,因為它在創建新邊緣之前只測試一個方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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