simplePath() 中断查询
simplePath() breaks query
在 match()
中添加 simplePath()
时,我的查询不再有 returns 结果。
该查询尝试查找以某种方式涉及三个特定人员的任何事件(例如 "graph database conference")。
- "alice" 参加了举办活动的学校。
- "bob" 是活动中的热狗小贩。
- "marko" 为活动提供了安全保障。
我正在使用 match()
来寻找三个人汇合的地方。如果有更好的方法,请提出。谢谢!刚开始学习 gremlin。
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()
的 any 时,查询 returns 什么也没有。例如,在第一个 repeat()
g.V().match(
__.as('alice').hasLabel('person').has('name', 'alice').repeat(__.out().simplePath()).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()
gremlin 控制台:
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()
和 simplePath()
几乎肯定不会一起工作。如果 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]]
请注意,每一行都是一组路径;那是因为 - 理论上 - 每个人都可以通过不止一种方式与特定事件相关联。如果您只对人与事件之间的任何联系感兴趣,您可以从嵌套的 group()
步骤中删除 fold()
步骤。
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]
在 match()
中添加 simplePath()
时,我的查询不再有 returns 结果。
该查询尝试查找以某种方式涉及三个特定人员的任何事件(例如 "graph database conference")。
- "alice" 参加了举办活动的学校。
- "bob" 是活动中的热狗小贩。
- "marko" 为活动提供了安全保障。
我正在使用 match()
来寻找三个人汇合的地方。如果有更好的方法,请提出。谢谢!刚开始学习 gremlin。
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()
的 any 时,查询 returns 什么也没有。例如,在第一个 repeat()
g.V().match(
__.as('alice').hasLabel('person').has('name', 'alice').repeat(__.out().simplePath()).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()
gremlin 控制台:
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()
和 simplePath()
几乎肯定不会一起工作。如果 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]]
请注意,每一行都是一组路径;那是因为 - 理论上 - 每个人都可以通过不止一种方式与特定事件相关联。如果您只对人与事件之间的任何联系感兴趣,您可以从嵌套的 group()
步骤中删除 fold()
步骤。
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]