![](/img/trans.png)
[英]How to perform cross join on different vertices in Gremlin/Tinkerpop
[英]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”標簽。 為什么? groupCount
是ReducingBarrierStep
,在這些步驟之后路徑會丟失。
好吧,讓我們回去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.