Gremlin simplePath()中断查询

Gremlin simplePath()中断查询,gremlin,tinkerpop3,Gremlin,Tinkerpop3,在match()中加载simplePath()时,我的查询不再返回结果 该查询尝试查找以某种方式涉及三个特定人员的任何事件(例如“graph database conference”) “爱丽丝”参加了主办这次活动的学校 “鲍勃”是活动中的热狗供应商 “marko”为活动提供了安全保障 我正在使用match()查找这三个人的共同点。如果有更好的办法,请提出。谢谢刚刚开始学习小精灵 Ascii艺术: alice --[enrolled-in]-> gremlin

match()
中加载
simplePath()
时,我的查询不再返回结果

该查询尝试查找以某种方式涉及三个特定人员的任何事件(例如“graph database conference”)

  • “爱丽丝”参加了主办这次活动的学校
  • “鲍勃”是活动中的热狗供应商
  • “marko”为活动提供了安全保障
我正在使用
match()
查找这三个人的共同点。如果有更好的办法,请提出。谢谢刚刚开始学习小精灵

Ascii艺术:

            alice --[enrolled-in]-> gremlin 101 --[offered-by]-> graph db school --[hosted]--------------
                                                                                                        |
                                                                                                        v
bob --[works-for]-> hot dogs r awesome --[subcontractor-of]-> best event planner --[planned]----> graph conference
                                                                                                        ^
                                                                                                        |
                                            marko --[works-for]-> super security --[secured]-------------
有效的查询:

g.V().match(
  __.as('alice').hasLabel('person').has('name', 'alice').repeat(__.out()).until(__.hasLabel('event')).as('event'),
  __.as('event').repeat(__.in()).until(__.hasLabel('person').has('name', 'bob')).as('bob'),
  __.as('event').repeat(__.in()).until(__.hasLabel('person').has('name', 'marko')).as('marko')).
  path()

==>[v[0],v[0],v[2],v[5],v[21],v[21],v[13],v[10],v[8],v[21],v[18],v[16],[bob:v[8],alice:v[0],event:v[21],marko:v[16]]]
请注意,有些顶点出现不止一次(我们甚至还没有添加任何循环!)

当我将
.simplePath()
添加到任何
repeat()
时,查询不返回任何结果。例如,在第一个
repeat()

小精灵控制台:

alice = g.addV('person').property('name', 'alice').next()
gremlin101 = g.addV('course').property('name', 'gremlin 101').next()
g.addE('enrolled-in').from(alice).to(gremlin101)

school = g.addV('school').property('name', 'graph db school').next()
g.addE('offered-by').from(gremlin101).to(school)

bob = g.addV('person').property('name', 'bob').next()
hotDogs = g.addV('business').property('name', 'hot dogs r awesome').next()
g.addE('works-for').from(bob).to(hotDogs)

eventPlanner = g.addV('business').property('name', 'best event planner').next()
g.addE('subcontractor-of').from(hotDogs).to(eventPlanner)

marko = g.addV('person').property('name', 'marko').next()
security = g.addV('business').property('name', 'super security').next()
g.addE('works-for').from(marko).to(security)

event = g.addV('event').property('name', 'graph conference').next()
g.addE('hosted').from(school).to(event)
g.addE('secured').from(security).to(event)
g.addE('planned').from(eventPlanner).to(event)
match()。如果
match()。要查找所有匹配的事件,请执行以下操作:

gremlin> g.V().has("person", "name", within("alice","bob","marko")).as("p").
......1>   repeat(out().simplePath()).
......2>     until(hasLabel("event")).
......3>   group().
......4>     by("name").
......5>     by(group().
......6>          by(select("p").by("name")).
......7>          by(path().by("name").fold())).unfold().
......8>   filter(select(values).count(local).is(3)).
......9>   select(keys)
==>graph conference
如果您还对每个人到活动的路径感兴趣:

gremlin> g.V().has("person", "name", within("alice","bob","marko")).as("p").
......1>   repeat(out().simplePath()).
......2>     until(hasLabel("event")).
......3>   group().
......4>     by("name").
......5>     by(group().
......6>          by(select("p").by("name")).
......7>          by(path().by("name").fold())).unfold().
......8>   filter(select(values).count(local).is(3)).
......9>   select(values).unfold().
.....10>   select(values)
==>[[bob,hot dogs r awesome,best event planner,graph conference]]
==>[[alice,gremlin 101,graph db school,graph conference]]
==>[[marko,super security,graph conference]]
请注意,每一行都是一个路径数组;这是因为——理论上——每个人都可以通过不止一种方式与特定事件联系在一起。如果您只对人员和事件之间的任何连接感兴趣,则可以从嵌套的
组()步骤中删除
折叠()
步骤

gremlin> g.V().has("person", "name", within("alice","bob","marko")).as("p").
......1>   repeat(out().simplePath()).
......2>     until(hasLabel("event")).
......3>   group().
......4>     by("name").
......5>     by(group().
......6>          by(select("p").by("name")).
......7>          by(path().by("name"))).unfold().
......8>   filter(select(values).count(local).is(3)).
......9>   select(values).unfold().
.....10>   select(values)
==>[bob,hot dogs r awesome,best event planner,graph conference]
==>[alice,gremlin 101,graph db school,graph conference]
==>[marko,super security,graph conference]

作为一个小精灵新手,我把它们看作是一堵文字墙。但有一次我剥去图层,一层一层地添加回去,查询是有意义的。
count(local).is(3)
把我搞糊涂了,但现在我明白了这需要所有三个人都参加了活动。这真的很有帮助。
gremlin> g.V().has("person", "name", within("alice","bob","marko")).as("p").
......1>   repeat(out().simplePath()).
......2>     until(hasLabel("event")).
......3>   group().
......4>     by("name").
......5>     by(group().
......6>          by(select("p").by("name")).
......7>          by(path().by("name"))).unfold().
......8>   filter(select(values).count(local).is(3)).
......9>   select(values).unfold().
.....10>   select(values)
==>[bob,hot dogs r awesome,best event planner,graph conference]
==>[alice,gremlin 101,graph db school,graph conference]
==>[marko,super security,graph conference]