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 楼答案
使用AirRoutes数据集,我尝试使用Amazon Neptune和TinkerGraph模拟您的查询。在每种情况下,一切似乎都按预期进行。我得到了我期望得到的所有边缘。这是我用来测试的
AirRoutes数据集包括没有匹配返回的路线。所以我用其中的一些来模拟一些我们想要创建一些边的地方
使用这个基础,我添加了你的^ {CD1>}步骤。请注意,我在下面删除的查询中的
addE
步骤之间有一个不需要的逗号然后,我们可以验证是否创建了所有预期的结构
请注意,可以使用
where
步骤在不使用match
的情况下重写查询,这可能会导致更高效的查询执行计划