【发布时间】:2021-09-30 20:14:15
【问题描述】:
我正在尝试为尚未存在的每个 [Org-Manages->User] 添加一个Subscription 顶点([Org-Sends->Subscription
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 的“输入”是一组“行”,其中包含许多重复的 Org 顶点。我还尝试在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]})
])
]
【问题讨论】:
-
我做了很多实验(如下所示),但无法重现我相信您所描述的内容。也许你可以看看我的回答,看看我是否遗漏了一些细微差别,这会使我的实验与众不同。
-
谢谢@KelvinLawrence,明天我会去看看。生产查询更复杂,但只能通过附加属性,我用
match-part 确认sideEffect的输入实际上返回了所有预期的展开对。
标签: java groovy gremlin tinkerpop amazon-neptune