簡體   English   中英

CosmosDB:使用現有屬性創建新屬性的 Gremlin 查詢

[英]CosmosDB: Gremlin Query to create a new property using existing property

每個頂點都有一個結構:

{
    Id: 123,
    field1: 10
}

我想將field2添加到所有頂點,以使field2的值等於field1

挑戰在於,我在這里和其他地方發現的幾乎所有查詢都在 cosmos DB 中給出了語法錯誤。

例如

g.V().has("field1").property("field2", values("field1")) 

這給出了一個錯誤: Cannot create ValueField on non-primitive type GraphTraversal

請建議一個 cosmos DB 兼容查詢(如果需要,多步)來在 DB 上執行此操作。 這是對 DB 的一次性操作,不會再次執行。

正如我在其他地方提到的,我不是 CosmosDB 專家,但我敢猜測你所問的問題不能用 CosmosDB 完成。 您肯定擁有最簡單形式的正確語法,因此更復雜的形式以某種方式解決問題的想法似乎不太可能。 我想此時property(String, Traversal)根本不受支持,這意味着不可能進行就地更新。

如果您願意,您可以測試復雜的 forms(例如select(Traversal,Traversal)以獲得您自己的滿意 - 例如,從演示如何從 map 數據更新頂點的博客文章中:

gremlin> m = [name:'marko',age:29,country:'usa']
==>name=marko
==>age=29
==>country=usa
gremlin> g.withSideEffect('properties',m).
......1>   addV('person').as('vertex').
......2>   sideEffect(select('properties').
......3>              unfold().as('kv').
......4>              select('vertex').
......5>              property(select('kv').by(Column.keys), select('kv').by(Column.values)))
==>v[0]
gremlin> g.V().has('person','name','marko').elementMap()
==>[id:0,label:person,country:usa,name:marko,age:29]

因此,您唯一的辦法是查詢您希望更新的頂點,然后發送額外的遍歷以更新您想要的字段。 從結構上講,這個建議是簡單地檢索Map形式的數據,即鍵的頂點標識符和保存您希望移動的數據的值,然后簡單地在返回的映射列表上使用 for 循環來發出查詢標識/值:

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> data = g.V().has('age')
==>v[1]
==>v[2]
==>v[4]
==>v[6]
gremlin> data = g.V().has('age').project('id','age').by(id).by('age').toList()
==>[id:1,age:29]
==>[id:2,age:27]
==>[id:4,age:32]
==>[id:6,age:35]
gremlin> data.each { g.V(it['id']).property('personAge',it['age']).iterate() };[]
gremlin> g.V().has('personAge').project('id','age').by(id).by('personAge')
==>[id:1,age:29]
==>[id:2,age:27]
==>[id:4,age:32]
==>[id:6,age:35]

暫無
暫無

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

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