[英]How to project on multiple different node values with Gremlin
當我嘗試從 gremlin 的投影中獲取結果時,我遇到了性能問題。 我的方法肯定是錯誤的。 但我很理解這個問題。
我有一個數據模型,例如:
我想為所有 D 獲得一張桌子:
V1 | D.id | V2 | V3 | V4 | V5 | V6
為此,我嘗試了一個請求(每個圓圈都是一個節點):
g.V().hasLabel(A)
.out().hasLabel(B).as('B_node')
.out().hasLabel(C)
.out().hasLabel(V1).values('value1').as('value1')
.select('B_node')
.out().hasLabel(D)
.project('V1', 'D.id', 'V2', 'V3', 'V4', 'V5', 'V6')
.by(select('value1'))
.by(id())
.by(out().hasLabel(E).out().hasLabel(V2).values('value2'))
.by(out().hasLabel(F).out().hasLabel(V3).values('value3'))
.by(out().hasLabel(F).out().hasLabel(V4).values('value4'))
.by(out().hasLabel(G).out().hasLabel(V5).values('value5'))
.by(out().hasLabel(G).out().hasLabel(V6).values('value6'))
問題是節點D的數量和D中的節點數量很大。 我了解每個 DI 將執行多次循環以查找 F 和查找 G。我該如何避免這種情況? 並創建一個別名來只循環一次?
如果我不清楚,請隨時問我問題。
並不是說這是完全最佳的,但這可能會給你一些關於其他嘗試的想法:
g.V().hasLabel('A').
repeat(
out().
sideEffect(
or(
hasLabel('D'),
not(out())
).
aggregate('collect'))
).
fold().select('collect').unfold().label()
或者另一種方式:
g.V().hasLabel('A').
union(
repeat(
out().
sideEffect(
hasLabel('D').
aggregate('collect')
)
).
until(not(out())).label(),
select('collect').unfold().label()
)
Output:
D, V1, V2, V3, V4, V5, V6
在任何一種情況下,您都從 label 'A' 的頂點開始,並在圖中遍歷,直到找到所有葉節點。 在此過程中,您還想拾取車輛節點,這就是 sideEffect() 步驟的用途。
對於那些偶然發現並希望圖表進行測試的人:
g.addV('A').as('A').
addV('B').as('B').
addV('C').as('C').
addV('D').as('D').
addV('E').as('E').
addV('F').as('F').
addV('G').as('G').
addV('V1').as('V1').
addV('V2').as('V2').
addV('V3').as('V3').
addV('V4').as('V4').
addV('V5').as('V5').
addV('V6').as('V6').
addE('so-65359695').from('A').to('B').
addE('so-65359695').from('B').to('C').
addE('so-65359695').from('C').to('V1').
addE('so-65359695').from('B').to('D').
addE('so-65359695').from('D').to('G').
addE('so-65359695').from('G').to('V5').
addE('so-65359695').from('G').to('V6').
addE('so-65359695').from('D').to('E').
addE('so-65359695').from('E').to('V2').
addE('so-65359695').from('D').to('F').
addE('so-65359695').from('F').to('V3').
addE('so-65359695').from('F').to('V4')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.