使用派生值过滤 gremlin 遍历
Using derived values to filter gremlin traversals
早上好!
我有以下数据模型,其中操作遵循旅程,可以通过具有与旅程 ID 匹配的标签的连接边来唯一标识。请参阅下面的示例。
Data Model
我想要实现的是,我可以将每个独特的旅程组合在一起并给它们一个计数。例如,在上面的数据中,如果 Jeremy 早上醒来吃鸡蛋,然后晚上吃吐司,我想看到:
Jeremy/Morn->Eats->Eggs->JourneyEnd, count: 1
Jeremy/Eve->吃->吐司->旅程结束,计数:1
相反,我(可以理解)得到:
Jeremy/Morn->吃->鸡蛋->旅程结束
Jeremy/Eve->吃->吐司->旅程结束
Jeremy/Morn->吃->吐司->旅程结束
Jeremy/Eve->吃->鸡蛋->旅程结束
我试过使用重复过滤和如下语句:
g.V().hasLabel('UserJourney').as('root').
out('firstStep').repeat(
outE().filter(
label().is(select('root').by(id())))).
until(hasLabel('JourneyEnd')).path()
但是(我认为)由于遍历的工作方式,它不可行,因为在我回去阅读时根步骤包含所有旅程。
欢迎就如何获得我正在寻找的输出提出任何建议。设置脚本如下:
g.addV('UserJourney').property(id, 'Jeremy/Morn').
addV('UserJourney').property(id, 'Jeremy/Eve').
addV('JourneyStep').property(id, 'I Need').
addV('JourneyStep').property(id, 'Eats').
addV('JourneyStep').property(id, 'Eggs').
addV('JourneyStep').property(id, 'Toast').
addV('JourneyEnd').property(id, 'JourneyEnd').
addE('Jeremy/Morn').from(V('Eats')).to(V('Eggs')).
addE('Jeremy/Morn').from(V('Eggs')).to(V('JourneyEnd')).
addE('firstStep').from(V('Jeremy/Morn')).to(V('Eats')).
addE('Jeremy/Eve').from(V('Eats')).to(V('Toast')).
addE('Jeremy/Eve').from(V('Toast')).to(V('JourneyEnd')).
addE('firstStep').from(V('Jeremy/Eve')).to(V('Eats')).
iterate()
您可以使用 path
、from
和 where...by
步骤来实现您的需要。
gremlin> g.V().hasLabel('UserJourney').as('a').out().
......1> repeat(outE().where(eq('a')).by(label).by(id).inV()).
......2> until(hasLabel('JourneyEnd')).
......3> path().
......4> from('a')
==>[v[Jeremy/Morn],v[Eats],e[3][Eats-Jeremy/Morn->Eggs],v[Eggs],e[4][Eggs-Jeremy/Morn->JourneyEnd],v[JourneyEnd
]]
==>[v[Jeremy/Eve],v[Eats],e[6][Eats-Jeremy/Eve->Toast],v[Toast],e[7][Toast-Jeremy/Eve->JourneyEnd],v[JourneyEnd
]]
要从结果中移除边缘,可以使用 flatMap
gremlin> g.V().hasLabel('UserJourney').as('a').out().
......1> repeat(flatMap(outE().where(eq('a')).by(label).by(id).inV())).
......2> until(hasLabel('JourneyEnd')).
......3> path().
......4> from('a')
==>[v[Jeremy/Morn],v[Eats],v[Eggs],v[JourneyEnd]]
==>[v[Jeremy/Eve],v[Eats],v[Toast],v[JourneyEnd]]
早上好!
我有以下数据模型,其中操作遵循旅程,可以通过具有与旅程 ID 匹配的标签的连接边来唯一标识。请参阅下面的示例。
Data Model
我想要实现的是,我可以将每个独特的旅程组合在一起并给它们一个计数。例如,在上面的数据中,如果 Jeremy 早上醒来吃鸡蛋,然后晚上吃吐司,我想看到:
Jeremy/Morn->Eats->Eggs->JourneyEnd, count: 1
Jeremy/Eve->吃->吐司->旅程结束,计数:1
相反,我(可以理解)得到:
Jeremy/Morn->吃->鸡蛋->旅程结束
Jeremy/Eve->吃->吐司->旅程结束
Jeremy/Morn->吃->吐司->旅程结束
Jeremy/Eve->吃->鸡蛋->旅程结束
我试过使用重复过滤和如下语句:
g.V().hasLabel('UserJourney').as('root').
out('firstStep').repeat(
outE().filter(
label().is(select('root').by(id())))).
until(hasLabel('JourneyEnd')).path()
但是(我认为)由于遍历的工作方式,它不可行,因为在我回去阅读时根步骤包含所有旅程。
欢迎就如何获得我正在寻找的输出提出任何建议。设置脚本如下:
g.addV('UserJourney').property(id, 'Jeremy/Morn').
addV('UserJourney').property(id, 'Jeremy/Eve').
addV('JourneyStep').property(id, 'I Need').
addV('JourneyStep').property(id, 'Eats').
addV('JourneyStep').property(id, 'Eggs').
addV('JourneyStep').property(id, 'Toast').
addV('JourneyEnd').property(id, 'JourneyEnd').
addE('Jeremy/Morn').from(V('Eats')).to(V('Eggs')).
addE('Jeremy/Morn').from(V('Eggs')).to(V('JourneyEnd')).
addE('firstStep').from(V('Jeremy/Morn')).to(V('Eats')).
addE('Jeremy/Eve').from(V('Eats')).to(V('Toast')).
addE('Jeremy/Eve').from(V('Toast')).to(V('JourneyEnd')).
addE('firstStep').from(V('Jeremy/Eve')).to(V('Eats')).
iterate()
您可以使用 path
、from
和 where...by
步骤来实现您的需要。
gremlin> g.V().hasLabel('UserJourney').as('a').out().
......1> repeat(outE().where(eq('a')).by(label).by(id).inV()).
......2> until(hasLabel('JourneyEnd')).
......3> path().
......4> from('a')
==>[v[Jeremy/Morn],v[Eats],e[3][Eats-Jeremy/Morn->Eggs],v[Eggs],e[4][Eggs-Jeremy/Morn->JourneyEnd],v[JourneyEnd
]]
==>[v[Jeremy/Eve],v[Eats],e[6][Eats-Jeremy/Eve->Toast],v[Toast],e[7][Toast-Jeremy/Eve->JourneyEnd],v[JourneyEnd
]]
要从结果中移除边缘,可以使用 flatMap
gremlin> g.V().hasLabel('UserJourney').as('a').out().
......1> repeat(flatMap(outE().where(eq('a')).by(label).by(id).inV())).
......2> until(hasLabel('JourneyEnd')).
......3> path().
......4> from('a')
==>[v[Jeremy/Morn],v[Eats],v[Eggs],v[JourneyEnd]]
==>[v[Jeremy/Eve],v[Eats],v[Toast],v[JourneyEnd]]