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