Gremlin 指定顶点列表可以到达的顶点列表

Gremlin 指定顶点列表可以到达的顶点列表,gremlin,tinkerpop3,gremlin-server,Gremlin,Tinkerpop3,Gremlin Server,这是我的图表的样子 g = TinkerGraph.open().traversal() school1 = g.addV('school').property('id', '1').next() school2 = g.addV('school').property('id', '2').next() student1 = g.addV('student').property('id', '3').next() student2 = g.addV('student').property('i

这是我的图表的样子

g = TinkerGraph.open().traversal()
school1 = g.addV('school').property('id', '1').next()
school2 = g.addV('school').property('id', '2').next()
student1 = g.addV('student').property('id', '3').next() 
student2 = g.addV('student').property('id', '4').next()     
g.addE('students').from(school1).to(student1)
g.addE('students').from(school1).to(student2)
g.addE('students').from(school2).to(student1)
我想找出两所学校共有的学生。为了扩展这个逻辑,如果我想为它编写一个通用的无限遍历逻辑,会发生什么呢

gremlin> g.V(school1).out('students').filter(__.in('students').is(school2)).valueMap(true)
==>[id:4,label:student,id:[3]]
不过,我不确定你所说的“为相同的对象编写一个通用的无限遍历逻辑”是什么意思

不过,我不确定“为相同的对象编写通用无限遍历逻辑”是什么意思。

这是可行的

gremlin> schools = [ '1', '2' ]
==>1
==>2
gremlin> g.V().
......1>   has('school', 'id', within(schools)).
......2>   out('students').
......3>   groupCount().by('id').
......4>   unfold().
......5>   filter( select(values).is(eq(schools.size())) ).
......6>   select(keys)
==>3
  • 从学校名单开始。假设学校比学生少,可能是安全的
  • out()
    从学校传给学生。在这一点上,一个学生在流中出现多次,他们所就读的每一所学校出现一次。我假设一所特定的学校和一个特定的学生之间只有一个优势
  • 执行
    groupCount()
    创建一个映射,其中对于每个条目,
    是学生id,
    是学生的学校数量
  • 使用
    unfold()
    对地图中的条目进行操作
  • 过滤器
    仅选择连接到列表中所有学校的学生,即学生的
    计数等于列表中的学校数
  • 最后
    选择(键)
    返回学生id作为结果
这是可行的

gremlin> schools = [ '1', '2' ]
==>1
==>2
gremlin> g.V().
......1>   has('school', 'id', within(schools)).
......2>   out('students').
......3>   groupCount().by('id').
......4>   unfold().
......5>   filter( select(values).is(eq(schools.size())) ).
......6>   select(keys)
==>3
  • 从学校名单开始。假设学校比学生少,可能是安全的
  • out()
    从学校传给学生。在这一点上,一个学生在流中出现多次,他们所就读的每一所学校出现一次。我假设一所特定的学校和一个特定的学生之间只有一个优势
  • 执行
    groupCount()
    创建一个映射,其中对于每个条目,
    是学生id,
    是学生的学校数量
  • 使用
    unfold()
    对地图中的条目进行操作
  • 过滤器
    仅选择连接到列表中所有学校的学生,即学生的
    计数等于列表中的学校数
  • 最后
    选择(键)
    返回学生id作为结果

@stephen-mallette@stephen-mallette这就是我所说的无限泛型遍历逻辑-g.V().has('tag','dev')。hasLabel('school')。has('id','1')。repeat(out().simplePath())。直到(inE('students'))。dedup().filter(uuuu.repeat(in_().simplePath())。直到(outE().outV().hasLabel('school')。has('id','2)))这就是我所说的无限泛型遍历逻辑-g.V().has('tag','dev')。hasLabel('school')。has('id','1')。repeat(out().simplePath())。until(inE('students'))。dedup().filter(uuuu.repeat(in_().simplePath())。until(outE().outV().hasLabel('school')。has('id','2)))