簡體   English   中英

如何使用 Gremlin 投影多個不同的節點值

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

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