有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我的Gremlin迁移查询只从每个顶点添加一条边?

我正在尝试为每个[Org Manages->;用户]添加一个Subscription顶点([Org Sends->;Subscription<;Receives User]),其中一个顶点尚未出现。我写了这个遍历,它似乎选择了我感兴趣的值:

g.V().hasLabel('Org')
  .match(
    __.as('oV').out('Manages').as('uV'),
    not(__.as('oV').out('Sends').in('Receives').as('uV')
  )

我得到一组具有相关顶点对的元组oV,uV。到目前为止,一切顺利

我随后附上:

.sideEffect(
  addV('Subscription').as('newV')
    .select('oV').addE('Sends').to(select('newV'))
    .select('uV').addE('Receives').to(select('newV'))
)

我希望,对于每一对oV,uV,都能设置相关的结构。相反,将创建所有订阅顶点,并创建所有接收边,但每个组织只创建一个发送边

就我所知,sideEffect的“输入”是一组“行”,其中有许多重复的组织顶点。我还尝试在sideEffect之前插入select('oV', 'uV'),但行为没有改变为什么addE只有addE在看到特定的oV后才会短路


我正在对Amazon Neptune执行此操作,并在控制台中运行explain。这就是我得到的解释,它似乎与我的书面遍历相匹配:

Final Traversal[
    NeptuneGraphQueryStep(Vertex),
    NeptuneTraverserConverterStep,
    MatchStep(
        AND,[
            [MatchStartStep(oV), VertexStep(OUT,[Manages],vertex), MatchEndStep(uV)],
            [MatchStartStep(oV), WhereTraversalStep([NotStep([WhereStartStep, VertexStep(OUT,[Sends],vertex), VertexStep(IN,[Receives],vertex), WhereEndStep(uV)])]), MatchEndStep, MatchEndStep]
        ]
    ),
    TraversalSideEffectStep([
        AddVertexStep({$migration=[asdf], label=[Subscription]})@[newV],
        SelectOneStep(last,oV),
        NoOpBarrierStep(2500),
        AddEdgeStep({~to=[[SelectOneStep(last,newV)]], label=[Sends]}),
        SelectOneStep(last,uV),
        NoOpBarrierStep(2500),
        AddEdgeStep({~to=[[SelectOneStep(last,newV)]], label=[Receives]})
    ])
]

共 (1) 个答案

  1. # 1 楼答案

    使用AirRoutes数据集,我尝试使用Amazon Neptune和TinkerGraph模拟您的查询。在每种情况下,一切似乎都按预期进行。我得到了我期望得到的所有边缘。这是我用来测试的

    AirRoutes数据集包括没有匹配返回的路线。所以我用其中的一些来模拟一些我们想要创建一些边的地方

    gremlin> g.V().has('airport','region','GB-ENG').
    ......1>   match(__.as('a').out('route').as('b'),
    ......2>         __.not(__.as('b').out('route').as('a'))).
    ......3>   select('a','b').by('code')
    ==>[a:MAN,b:ANU]
    ==>[a:LTN,b:ORY]  
    

    使用这个基础,我添加了你的^ {CD1>}步骤。请注意,我在下面删除的查询中的addE步骤之间有一个不需要的逗号

    gremlin> g.V().has('airport','region','GB-ENG').
    ......1>   match(__.as('a').out('route').as('b'),
    ......2>         __.not(__.as('b').out('route').as('a'))).
    ......3>   sideEffect(addV('Subscription').as('newV').
    ......4>              select('a').addE('Sends').to(select('newV')).
    ......5>              select('b').addE('Receives').to(select('newV')))
    
    ==>[a:v[84],b:v[219]]
    ==>[a:v[206],b:v[107]]
    

    然后,我们可以验证是否创建了所有预期的结构

    gremlin> g.V().hasLabel('Subscription')
    ==>v[61367]
    ==>v[61370]
    
    
    gremlin> g.V().hasLabel('Subscription').inE().outV().path()
    ==>[v[61367],e[61369][219-Receives->61367],v[219]]
    ==>[v[61367],e[61368][84-Sends->61367],v[84]]
    ==>[v[61370],e[61372][107-Receives->61370],v[107]]
    ==>[v[61370],e[61371][206-Sends->61370],v[206]]  
    

    请注意,可以使用where步骤在不使用match的情况下重写查询,这可能会导致更高效的查询执行计划

    gremlin> g.V().has('airport','region','GB-ENG').as('a').
    ......1>       out('route').as('b').
    ......2>       where(__.not(out('route').as('a'))).
    ......3>       select('a','b').
    ......4>       by('code')
    ==>[a:MAN,b:ANU]
    ==>[a:LTN,b:ORY]