[英]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.