指定的顶点列表可以到达的顶点列表
List of vertices that can be reached by a specified list of vertices
这是我的图表的样子。
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]]
但我不确定 "write a generic infinite traversal logic for the same" 是什么意思。
这可行
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()
从学校到学生。此时,一个学生多次出现在信息流中,每所学校出现一次。我假设特定学校和特定学生之间只有 1 个优势。
- 执行
groupCount()
创建一个地图,其中对于每个条目,key
是学生 ID,value
是学生的学校数量。
- 使用
unfold()
对Map中的条目进行操作。
filter
仅选择与列表中所有学校相关联的学生,即学生的 value
计数等于列表中学校的数量。
- 最后
select(keys)
以return学号作为结果。
这是我的图表的样子。
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]]
但我不确定 "write a generic infinite traversal logic for the same" 是什么意思。
这可行
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()
从学校到学生。此时,一个学生多次出现在信息流中,每所学校出现一次。我假设特定学校和特定学生之间只有 1 个优势。 - 执行
groupCount()
创建一个地图,其中对于每个条目,key
是学生 ID,value
是学生的学校数量。 - 使用
unfold()
对Map中的条目进行操作。 filter
仅选择与列表中所有学校相关联的学生,即学生的value
计数等于列表中学校的数量。- 最后
select(keys)
以return学号作为结果。