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



下面是我的图的样子。

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()以创建Map,其中对于每个条目,key是学生id,value是学生的学校数量
  • 使用unfold()对Map中的条目进行操作
  • filter只选择与列表中所有学校相连的学生,即学生的value计数等于列表中的学校数量
  • 最后select(keys)返回学生id作为结果

最新更新