遍历整个图的 Gremlin 查询
Gremlin query to traverse the whole graph
是否可以编写一个 Gremlin 查询,给定一个顶点,递归遍历连接到该节点的整个图?
例如,
watched director
user1 -------> movie_1 <------ chris nolan
^
user2------------|
watched
给定 movie_1、return 所有连接到 movie_1 的顶点(user1、user2、chris nolan),然后 return 个连接到 user1、user2、chris nolan 的顶点等等。
您可能会使用 repeat()
step 的一些变体来完成您想要的(即从起始顶点遍历任意步数)。在询问有关 Gremlin 的问题时,最好有图表的 asciiart 图,但最好有一个简单的 Gremlin 脚本来创建图表本身,如下所示:
g.addV('movie').property('name','movie-1').as('m').
addV('user').property('name','user-1').as('u1').
addV('user').property('name','user-2').as('u2').
addV('person').property('name','chris nolan').as('d').
addE('watched').from('u1').to('m').
addE('watched').from('u2').to('m').
addE('directed').from('d').to('m').iterate()
然后,要从 "movie-1" 开始并遍历到任意深度,只需执行:
gremlin> g.V().has('movie','name','movie-1').
......1> repeat(__.in()).
......2> emit().
......3> valueMap(true)
==>[id:2,label:user,name:[user-1]]
==>[id:4,label:user,name:[user-2]]
==>[id:6,label:person,name:[chris nolan]]
它将继续在传入边上遍历,直到它没有碰到任何顶点,发出沿途找到的所有顶点。显然,如果你的边没有全部遍历,那么你需要改变 repeat()
内的模式来遍历 both()
,但你会想尽量避免过程中的循环或repeat()
会无限遍历。使用 simplePath()
可能会有帮助,但最终您的循环终止方法将由您的图形结构定义。
请注意,这可能是一个昂贵的查询,具体取决于遍历深度。
是否可以编写一个 Gremlin 查询,给定一个顶点,递归遍历连接到该节点的整个图?
例如,
watched director
user1 -------> movie_1 <------ chris nolan
^
user2------------|
watched
给定 movie_1、return 所有连接到 movie_1 的顶点(user1、user2、chris nolan),然后 return 个连接到 user1、user2、chris nolan 的顶点等等。
您可能会使用 repeat()
step 的一些变体来完成您想要的(即从起始顶点遍历任意步数)。在询问有关 Gremlin 的问题时,最好有图表的 asciiart 图,但最好有一个简单的 Gremlin 脚本来创建图表本身,如下所示:
g.addV('movie').property('name','movie-1').as('m').
addV('user').property('name','user-1').as('u1').
addV('user').property('name','user-2').as('u2').
addV('person').property('name','chris nolan').as('d').
addE('watched').from('u1').to('m').
addE('watched').from('u2').to('m').
addE('directed').from('d').to('m').iterate()
然后,要从 "movie-1" 开始并遍历到任意深度,只需执行:
gremlin> g.V().has('movie','name','movie-1').
......1> repeat(__.in()).
......2> emit().
......3> valueMap(true)
==>[id:2,label:user,name:[user-1]]
==>[id:4,label:user,name:[user-2]]
==>[id:6,label:person,name:[chris nolan]]
它将继续在传入边上遍历,直到它没有碰到任何顶点,发出沿途找到的所有顶点。显然,如果你的边没有全部遍历,那么你需要改变 repeat()
内的模式来遍历 both()
,但你会想尽量避免过程中的循环或repeat()
会无限遍历。使用 simplePath()
可能会有帮助,但最终您的循环终止方法将由您的图形结构定义。
请注意,这可能是一个昂贵的查询,具体取决于遍历深度。