暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

通过Gremlin语言构建关系图并进行图分析

HugeGraph 2021-07-15
1628

背景

Gremlin是Apache TinkerPop框架下实现的图遍历语言,支持OLTP与OLAP,是目前图数据库领域主流的查询语言,可类比SQL语言之于关系型数据库。

HugeGraph是国内的一款开源图数据库,完全支持Gremlin语言。本文将讲述如何在HugeGraph图数据库上通过Gremlin来构建一张图,并进行一些基本的图分析。该图描述了TinkerPop框架、Gremlin语言、相关图数据库及其作者等实体之间的关系。最终图的效果如下:

构建图

参考官网文档的说明,整个图构建分为如下4步:准备图模型、创建Schema、添加顶点与边、验证结果。下面的Gremlin语句均在HugeGraph-Studio中执行。

  1. 准备图模型

    构建图之前,需要先考虑好图模型是什么样子,就像在关系型数据库里面,建表之前需要先构思好表结构及表关联关系一样,当然HugeGraph图数据库的建模相比关系数据库来说简单一些,针对某类实体,HugeGraph只需要把关注点放在:哪些实体类与它有联系,就加一类关联边,比如在人与人之间加一类朋友关联。


    在HugeGraph里面,一类实体由顶点类型(VertexLabel)来表述;一类关联边由边类型(EdgeLabel)来表述;实体或关联边可以包含属性,一类属性由属性类型(PropertyKey)来表述。


    在本实例中,包含如下结构:

    1) 包括3种VertexLabel:人”person”、软件”software”、语言”language”。

    2) 包括6种EdgeLabel:人认识人”knows”、人创建软件”created”、软件包含软件”contains”、软件定义语言”define”、软件实现软件”implements”、软件支持语言”supports”。

    3) 此外包括6种PropertyKey:姓名”name”、年龄”age”、地址”addr”、使用语言”lang”、标签”tag”、权重”weight”。

  2. 创建Schema(内容较多,完整代码请阅读原文)

    1. 创建属性类型(PropertyKey)

    2. 创建顶点类型(VertexLabel)

    3. 创建边类型(EdgeLabel)

  3. 添加顶点与边(内容较多,完整代码请阅读原文)

    1. 添加TinkerPop相关顶点与边

    2. 添加HugeGraph相关顶点与边

    3. 添加Titan相关顶点与边

  4. 验证结果

    查询所有的顶点及其关联边,验证结果是否为构想好的图。

     
    // 查询所有的顶点"g.V()"
    g.V()

分析图

基于上述构建好的图,可以进一步进行图查询与分析。下面给出了几个典型的应用。

  1. 根据顶点类型和名称来查询”Gremlin“顶点:

     
    // g.V()表示查询顶点,hasLabel过滤顶点类型,has过滤属性
    g.V().hasLabel("language")
        .has("name", "Gremlin")

    执行结果:顶点Gremlin

  2. 查询哪些图数据库支持Gremlin:

     
    // in表示查询顶点的入顶点,也就是指向Gremlin顶点的顶点
    g.V().hasLabel("language")
        .has("name", "Gremlin")
         .in("supports")

    执行结果:顶点HugeGraph
    、顶点Titan
    、顶点TinkerGraph

  3. 查询支持Gremlin的数据库的作者,并且年龄是29岁:

     
    // in后面可以接has进行条件过滤
    g.V().hasLabel("language")
        .has("name", "Gremlin")
         .in("supports")
         .in("created")
        .has("age", 29)

    执行结果:顶点Marko A. Rodriguez
    、顶点Jermy Li
    、顶点Zhoney Zhang

  4. 查看上一个查询(查询3)所经过的路径:

     
    // path表示每一步的中间结果都会保留下来,最终作为路径
    g.V().hasLabel("language")
        .has("name", "Gremlin")
         .in("supports")
         .in("created")
        .has("age", 29)
         .path().by("name")

    执行结果:共3条路径分别是

    Gremlin
    - Titan
    - Marko A. Rodriguez

    Gremlin
    - HugeGraph
    - Jermy Li

    Gremlin
    - HugeGraph
    - Zhoney Zhang

  5. 查询路径时保留所经过的边信息

     
    // inE表示顶点的入边,outV表示边的出顶点,两步加起来等价于in
    g.V().hasLabel("language")
        .has("name", "Gremlin")
         .inE("supports").outV()
         .path()

    执行结果:共3条路径分别是(中间保留了边ID信息)

    Gremlin
    - S3:Titan>6>>S4:Gremlin
    - Titan

    Gremlin
    - S3:HugeGraph>6>>S4:Gremlin
    - HugeGraph

    Gremlin
    - S3:TinkerGraph>6>>S4:Gremlin
    - TinkerGraph

  6. 将查询到的路径信息以图的形式展现

     
    g.V().hasLabel("language")
        .has("name", "Gremlin")
         .inE("supports").outV()
         .inE("created").outV()
        .has("age", 29)
         .path()

    执行结果:

更多Gremlin语法可参考TinkerPop官网文档:

http://tinkerpop.apache.org/docs/current/reference/#traversal

请点击“阅读原文”查看完整代码


文章转载自HugeGraph,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论