[英]How can I set the values of a list property in gremlin (CosmosDb) and project it in the query result?
我有一個具有列表屬性的頂點,我想替換所述屬性中的值並以特定格式投影出結果。 對於上下文,讓我們假設以下數據:
g.AddV("Post").property("id", "1")
.property(list, "Tags", "gremlin")
.property(list, "Tags", "new")
我希望能夠設置Tags
屬性。 到目前為止我嘗試過的:
g.V("1")
.sideEffect( properties("Tags").drop() )
.property(list, "Tags", "gremlin")
.property(list, "Tags", "closed")
.property(list, "Tags", "solved")
.project("Tags").By(values("Tags"))
我期望的是以下內容
{
"Tags": [
"gremlin",
"closed",
"solved",
]
}
但我反而得到錯誤Project By: Next: The provided traverser of key "Tags" maps to nothing.
所以看起來好像Tags
屬性被完全刪除了。 如果我之后進行查詢
g.V("1").project("Tags").By(values("Tags"))
我得到了預期的結果:
{
"Tags": [
"gremlin",
"closed",
"solved",
]
}
所以數據肯定已經改變了。 如果我嘗試不進行投影,結果將包含新值。
g.V("1")
.sideEffect( properties("Tags").drop() )
.property(list, "Tags", "gremlin")
.property(list, "Tags", "closed")
.property(list, "Tags", "solved")
導致:
{
"id": "1",
"label": "Post",
"type": "vertex",
"properties": {
"Tags": [
{
"id": "4eaf5599-511c-4245-aaf8-15c828073fac",
"value": "gremlin"
},
{
"id": "75e3ad96-a503-4608-a675-e28f3ffc2ab4",
"value": "closed"
},
{
"id": "aea1a33c-bd8e-47bb-b294-f01db8642db5",
"value": "solved"
},
]
}
}
但這讓我無法預測結果。
我如何才能更新數據並對其進行投影?
我嘗試過的其他事情:
drop()
barrier()
步驟之后添加一個barrier()
步驟,不起作用sideEffect()
barrier()
步驟之后添加一個barrier()
步驟,沒有用project()
barrier()
步驟之前添加了一個barrier()
步驟,沒有用.fold().unfold()
代替,沒有用optional(gV("1").project("Tags").by(values("Tags")))
替換project()
步驟 - 這個步驟通過重新獲取頂點來工作,但很昂貴。在這種情況下,CosmosDB 可能會發生一些事情,這意味着您可能需要從他們那里獲得特定幫助。 請注意,您的遍歷與 TinkerGraph 一起工作(幾乎與編寫的一樣),TinkerGraph 是 Gremlin應該如何工作的參考實現:
gremlin> g = TinkerFactory.createTheCrew().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:14], standard]
gremlin> g.V().has('person','name','marko').
......1> sideEffect(properties("location").drop()).
......2> property(list,'location','bombay').
......3> property(list,'location','calcutta').
......4> project('location').
......5> by(values('location').fold())
==>[location:[bombay,calcutta]]
也許您應該在project()
上使用我的by()
調制器嘗試查詢,以查看添加的fold()
有任何不同。 順便說一句,我不希望您在沒有fold()
情況下遍歷返回您所說的返回內容。 如果我嘗試這樣做,請注意 TinkerGraph 會發生什么:
gremlin> g.V().has('person','name','marko').
......1> sideEffect(properties("location").drop()).
......2> property(list,'location','bombay').
......3> property(list,'location','calcutta').
......4> project('location').
......5> by(values('location'))
==>[location:bombay]
用
optional(gV("1").project("Tags").by(values("Tags")))
替換project()
步驟 - 這個步驟通過重新獲取頂點來工作,但很昂貴。
以上是一個有趣的觀點,盡管我個人不喜歡使用g
來生成子遍歷,所以更喜歡將匿名遍歷生成為optional(V("1").project("Tags").by(values("Tags")))
。 這讓我想知道 CosmosDB 是否沒有反映當前遍歷器中的突變,這就是為什么當您通過重新查詢刷新時會得到您正在尋找的結果。 我很驚訝中間遍歷查找很昂貴,因為它是按元素id
查找並且應該是在圖中查找事物的最快方法。 也就是說,您必須在同一次遍歷中多次查找Vertex
並不是很好。
出於好奇,您可能會嘗試valueMap(true)
而不是project()
作為另一個測試,以查看是否會觸發任何不同的行為。
另一件要嘗試的事情可能是使用union()
而不是sideEffect()
:
gremlin> g.V().has('person','name','marko').
......1> union(properties("location").drop(), identity()).
......2> property(list,'location','bombay').
......3> property(list,'location','calcutta').
......4> project('location').
......5> by(values('location').fold())
==>[location:[bombay,calcutta]]
看看這是否有什么不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.