Gremlin 使用派生值过滤小精灵遍历

Gremlin 使用派生值过滤小精灵遍历,gremlin,tinkerpop,tinkerpop3,Gremlin,Tinkerpop,Tinkerpop3,早上好 我有下面的数据模型,其中动作跟随一个旅程,这个旅程可以通过连接边唯一地识别,连接边有一个与旅程ID匹配的标签。见下面的示例 我试图实现的是,我可以将每一次独特的旅程组合在一起,并对它们进行计数。例如,在上面的数据中,如果Jeremy早上醒来吃鸡蛋,然后晚上吃吐司,我想看到: 杰里米/早上->吃->蛋->日记结束,计数:1 杰里米/伊芙->吃->吐司->日记结束,计数:1 相反,我(可以理解)得到: 杰里米/早上->吃->蛋->日记 杰里米/伊芙->吃->烤面包->记日记 杰里米/早上-

早上好

我有下面的数据模型,其中动作跟随一个旅程,这个旅程可以通过连接边唯一地识别,连接边有一个与旅程ID匹配的标签。见下面的示例

我试图实现的是,我可以将每一次独特的旅程组合在一起,并对它们进行计数。例如,在上面的数据中,如果Jeremy早上醒来吃鸡蛋,然后晚上吃吐司,我想看到:

杰里米/早上->吃->蛋->日记结束,计数:1

杰里米/伊芙->吃->吐司->日记结束,计数:1

相反,我(可以理解)得到:

杰里米/早上->吃->蛋->日记

杰里米/伊芙->吃->烤面包->记日记

杰里米/早上->吃->烤面包->记日记

杰里米/伊芙->吃->蛋->日记

我尝试过使用repeat和如下语句进行过滤:

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()

您可以使用
路径
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]]   

    

非常感谢开尔文!这是一种享受。我将继续阅读和实验,以更好地理解这个解决方案