簡體   English   中英

如何在Gremlin / Tinkerpop 3中查詢多個頂點及其關系計數?

[英]How to query for multiple vertices and counts of their relationships in Gremlin/Tinkerpop 3?

我正在使用Gremlin / Tinkerpop 3來查詢存儲在TitanDB中的圖形。

該圖包含具有屬性的用戶頂點,例如“description”,以及表示用戶之間關系的edge。

我想使用Gremlin來獲取1)用戶的屬性和2)與其他用戶的關系數量(在這種情況下為任何類型)(例如,id = 123)。 為了實現這一點,我在Gremlin 3中使用match操作,如下所示:

g.V().match('user',__.as('user').has('description',new P(CONTAINS,'developer')),
__.as('user').out().hasId(123).values('name').groupCount('a').cap('a').as('relationships'))
.select()

此查詢工作正常,除非返回多個用戶頂點,例如,因為多個用戶在其描述中包含“developer”一詞。 在這種情況下,關系中的計數是所有返回用戶與id為123的用戶之間的所有關系的總和,而不是根據需要,每個返回用戶的個人計數。

我做錯了什么或者這可能是錯誤的?

PS:這個問題與我之前發布的關於Tinkerpop 2中類似查詢的問題有關,我在那里遇到了另一個問題: 如何用Gremlin選擇可選的圖形結構?

這是我使用的示例數據:

graph = TinkerGraph.open()
g = graph.traversal()
v123=graph.addVertex(id,123,"description","developer","name","bob")
v124=graph.addVertex(id,124,"description","developer","name","bill")
v125=graph.addVertex(id,125,"description","developer","name","brandy")
v126=graph.addVertex(id,126,"description","developer","name","beatrice")
v124.addEdge('follows',v125)
v124.addEdge('follows',v123)
v124.addEdge('likes',v126)
v125.addEdge('follows',v123)
v125.addEdge('likes',v123)
v126.addEdge('follows',v123)
v126.addEdge('follows',v124)

我的第一個想法是:“我們真的需要匹配步驟”嗎? 其次,當然,我想用TP3方式寫這個,而不是使用lambda / closure。 我在第一次迭代中嘗試了所有方式,而我得到的最接近的是Daniel Kuppitz這樣的東西:

gremlin> g.V().as('user').local(out().hasId(123).values('name')
              .groupCount()).as('relationships').select()
==>[relationships:[:]]
==>[relationships:[bob:1]]
==>[relationships:[bob:2]]
==>[relationships:[bob:1]]

所以這里我們使用局部步驟來限制當前元素的local遍歷。 這有效,但我們在select丟失了“user”標簽。 為什么? groupCountReducingBarrierStep ,在這些步驟之后路徑會丟失。

好吧,讓我們回去match 我想我可以嘗試使用local進行match步驟遍歷:

gremlin> g.V().match('user',__.as('user').has('description','developer'),
gremlin>             __.as('user').local(out().hasId(123).values('name').groupCount()).as('relationships')).select()
==>[relationships:[:], user:v[123]]
==>[relationships:[bob:1], user:v[124]]
==>[relationships:[bob:2], user:v[125]]
==>[relationships:[bob:1], user:v[126]]

好的 - 成功 - 這就是我們想要的:沒有lambdas和本地計數。 但是,它仍然讓我感覺:“我們真的需要匹配步驟”嗎? 這時候,Kuppitz先生關閉了最終的答案,這使得豐富的使用步:

gremlin> g.V().has('description','developer').as("user","relationships").select().by()
              .by(out().hasId(123).values("name").groupCount())
==>[user:v[123], relationships:[:]]
==>[user:v[124], relationships:[bob:1]]
==>[user:v[125], relationships:[bob:2]]
==>[user:v[126], relationships:[bob:1]]

正如你所看到的, by可以鏈接(在某些步驟)。 第一個by頂點分組,第二個by分組元素處理“本地” groupCount

暫無
暫無

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

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