Gremlin查询遍历整个图

时间:2018-11-12 21:16:48

标签: gremlin datastax-enterprise-graph

是否可以编写给定一个顶点的Gremlin查询,以递归遍历连接到该节点的整个图?

例如,

      watched           director
user1 -------> movie_1 <------ chris nolan
                 ^
user2------------|  
      watched

给出movie_1,返回连接到movie_1的所有顶点(user1,user2,chris nolan),然后返回连接到user1,user2,chris nolan的顶点。

1 个答案:

答案 0 :(得分:3)

您可能会使用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()可能会有所帮助,但最终,您的循环终止方法将由您的图形结构定义。

请注意,根据遍历深度,这可能是一个昂贵的查询。