【问题标题】:Gremlin query to traverse the whole graphGremlin 查询遍历整个图
【发布时间】:2018-11-12 21:16:47
【问题描述】:

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

例如,

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

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

【问题讨论】:

    标签: gremlin datastax-enterprise-graph


    【解决方案1】:

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

    请注意,这可能是一个昂贵的查询,具体取决于遍历深度。

    【讨论】: