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

背景

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

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

构建图

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

  1. 准备图模型

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

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

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

    包括3种VertexLabel:

    • 人”person”
    • 软件”software”
    • 语言”language”

    包括6种EdgeLabel:

    • 人认识人”knows”
    • 人创建软件”created”
    • 软件包含软件”contains”
    • 软件定义语言”define”
    • 软件实现软件”implements”
    • 软件支持语言”supports”

    包括6种PropertyKey:

    • 姓名”name”
    • 年龄”age”
    • 地址”addr”
    • 使用语言”lang”
    • 标签”tag”
    • 权重”weight”
  2. 创建Schema

    1. 创建属性类型(PropertyKey)

      graph.schema().propertyKey("name").asText().create() // 创建姓名属性,文本类型
      graph.schema().propertyKey("age").asInt().create()   // 创建年龄属性,整数类型
      graph.schema().propertyKey("addr").asText().create() // 创建地址属性,文本类型
      graph.schema().propertyKey("lang").asText().create() // 创建语言属性,文本类型
      graph.schema().propertyKey("tag").asText().create()  // 创建标签属性,文本类型
      graph.schema().propertyKey("weight").asFloat().create() // 创建权重属性,浮点类型
    2. 创建顶点类型(VertexLabel)

      // 创建顶点类型:人"person",包含姓名、年龄、地址等属性,使用自定义的字符串作为ID
      graph.schema().vertexLabel("person")
                    .properties("name", "age", "addr", "weight")
                    .useCustomizeStringId()
                    .create()
      // 创建顶点类型:软件"software",包含名称、使用语言、标签等属性,使用名称作为主键
      graph.schema().vertexLabel("software")
                    .properties("name", "lang", "tag", "weight")
                    .primaryKeys("name")
                    .create()
      // 创建顶点类型:语言"language",包含名称、使用语言等属性,使用名称作为主键
      graph.schema().vertexLabel("language")
                    .properties("name", "lang", "weight")
                    .primaryKeys("name")
                    .create()
    3. 创建边类型(EdgeLabel)

      // 创建边类型:人认识人"knows",此类边由"person"指向"person"
      graph.schema().edgeLabel("knows")
                    .sourceLabel("person").targetLabel("person")
                    .properties("weight")
                    .create()
      // 创建边类型:人创建软件"created",此类边由"person"指向"software"
      graph.schema().edgeLabel("created")
                    .sourceLabel("person").targetLabel("software")
                    .properties("weight")
                    .create()
      // 创建边类型:软件包含软件"contains",此类边由"software"指向"software"
      graph.schema().edgeLabel("contains")
                    .sourceLabel("software").targetLabel("software")
                    .properties("weight")
                    .create()
      // 创建边类型:软件定义语言"define",此类边由"software"指向"language"
      graph.schema().edgeLabel("define")
                    .sourceLabel("software").targetLabel("language")
                    .properties("weight")
                    .create()
      // 创建边类型:软件实现软件"implements",此类边由"software"指向"software"
      graph.schema().edgeLabel("implements")
                    .sourceLabel("software").targetLabel("software")
                    .properties("weight")
                    .create()
      // 创建边类型:软件支持语言"supports",此类边由"software"指向"language"
      graph.schema().edgeLabel("supports")
                    .sourceLabel("software").targetLabel("language")
                    .properties("weight")
                    .create()
  3. 添加顶点与边

    1. 添加TinkerPop相关顶点与边

      // 调用Gremlin的addVer
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值