簡體   English   中英

如何在 gremlin (CosmosDb) 中設置列​​表屬性的值並將其投影到查詢結果中?

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

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