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

ISO-GQL:开启图查询新纪元

323

作者介绍‍‍‍‍‍‍


王杰,NebulaGraph committer, 专注图数据库查询优化。



背景

ISO 在今年发布了一种新的属性图查询语言 GQL(点此查看专家解读)。这是继 SQL 之后,时隔四十多年推出的第二个国际标准数据库查询语言。GQL 融合了 Cypher、SQL 以及多种主流编程语言的优点,为复杂图数据的分析提供了强大的解决方案。

基于 Cypher的进化:

GQL 如何增强图查询‍‍‍‍

1

增强的图模式匹配

强大的标签匹配语法

GQL 拥有强大的标签匹配功能。

通过引入 &
(与)、|
(或)和 !
(非)等逻辑运算符,让复杂的图数据查询变得简单直观。

在 Cypher 中,一个典型的查询可能是这样的:

     MATCH (n:Person)
    WHERE n.age > 30
    RETURN n
    而在 GQL 中,你可以进行更复杂的标签匹配:
       MATCH (n:Manager & FullTime | !Intern)
      WHERE n.age > 30
      RETURN n.name AS managerName, n.department AS dept

      这个 GQL 查询查找既是 ManagerFullTime 的人,或不是 Intern并且年龄大于 3 的人。

      类正则表达式的变长路径匹配语法

      GQL 引入了类似正则表达式的语法用于变长模式匹配,增强了路径匹配的灵活性。比如-[e]->{1,3}
      -[e]->+
      -[e]->*
        -[e]->?
      , 比 Cypher 更强大。

      路径限制器

      GQL 提供了四种路径限制器:WALK、TRAIL、ACYCLIC 和 SIMPLE,用于控制路径是否可以有重复点或边。

      路径选择器

      GQL提供了灵活的最短路径查询选项,包括查找所有最短路径、任意最短路径等多种选项,可以满足用户各种各样的需求。

      2

      现代化的变量定义

      局部变量定义

      GQL 引入了一种专门的语法,用于在 procedure 开始时定义局部变量,类似于早期 C 语言的做法。这些变量在整个 procedure 范围内可见。局部变量的引入使得 GQL 能够表达非线性数据流,实现数据的多次重用。
      例如,当用户需要对同一数据集进行多次分析时,GQL 的局部变量提供了一种高效的方法来存储和重用中间结果。这在进行复杂计算或需要以不同方式处理相同基础数据时特别有用。
      考虑一个需要分析社交网络中用户交互的场景:
         TABLE userActivity = {
        MATCH (u:User)-[a:ACTION]->()
        RETURN u.id AS userId, a.timestamp AS actionTime, a.type AS actionType
        }

        VALUE activeUsers = VALUE {
        FOR i IN userActivity
        WHERE i.actionTime > datetime('2024-01-01')
        RETURN DISTINCT i.userId
        }

        VALUE uniqueActionTypes = VALUE {
        FOR i IN userActivity
        WHERE i.userId IN activeUsers
        RETURN count(DISTINCT i.actionType) AS uniqueActionTypes
        }
        在这个例子中,userActivity
        负责收集用户行为的基本数据集,然后这些数据被用来识别活跃用户并统计行为类型。

        LET 语句

        在 GQL 中,LET
        语句通过向当前输出表添加新列来定义变量。LET
        是非阻塞的,允许在不影响现有变量传递的情况下定义新变量。这与 Cypher 中的 WITH 子句不同,后者要求在 WITH 中显式指定所有现有变量。
        在 Cypher 中,定义新变量时必须显式传递所有现有变量:
           MATCH (v)-[e]->(v2)
          WITH v, e, v2, 1 AS a

          或者使用 WITH *
          保留所有变量:

             MATCH (v)-[e]->(v2)
            WITH *, 1 AS a

            在 GQL 中,LET
            化了这一过程:

               MATCH (v)-[e]->(v2)
              LET a = 1

              这里,v
              e
               和 v2
               仍然可访问,并且 a
              被无缝添加。相较于 Cypher 的 WITH
              , GQL的 LET
              大大简化了新变量的定义。


              3

              复杂嵌套查询

              GQL 的 CALL
              语句允许将一组语句封装到一个子查询块中,作为一个整体被外部语句引用。这在需要对多个查询的组合结果进行操作时特别有用。
              例如,要对两个不同查询的 union 后的结果进行排序:
                 CALL {
                MATCH (v:Person) RETURN v.name AS name
                UNION
                MATCH (v:City) RETURN v.name AS name
                }
                ORDER BY name


                GQL 与 SQL/PGQ 的比较

                SQL/PGQ 基于 SQL 扩展了其图查询能力,它与 GQL 共享只读图匹配语法。不过,与 SQL/PGQ 相比,GQL 提供了一套完整的读写语法,能够更好地满足图数据库的各种操作需求。

                另外,尽管 SQL 功能强大,但其语法设计存在一些著名的问题。比如,SQL 的子句顺序不直观且难以组合,用户常需使用变通方法来实现复杂需求。谷歌最近发布了一篇文章《SQL Has Problems. We Can Fix Them: Pipe Syntax In SQL》,指出了 SQL 的这些语法设计上的问题,并提出了一种特殊的管道操作符,旨在让子句更加线性和可组合,从而提升 SQL 的灵活性和直观性。

                相比之下,GQL 在设计上则显得更为先进和高效。GQL 的语法天生就是线性和可组合的。

                它具有一系列的功能正交的语句,如用于图模式匹配的 MATCH
                语句、用于结果过滤的 FILTER
                语句、用于展开列表的 FOR
                语句、用于变量定义的 LET
                语句和用于复杂嵌套查询的 CALL
                语句等等。 

                另外,GQL 还拥有 INSERT 、SET  等 DML 语句,它们可以与 DQL 语句优雅地、线性组合在一起。

                例如,你可以匹配节点,然后在它们之间插入一条边:

                   MATCH (a:player{id:1, name:"Tim"}), (b:player{id:2, name:"Jerry"})
                  INSERT (a)-[:follow{followness:90}]->(b)

                  以下两个图直观地展示了 SQL 和 GQL 语法的区别。

                  图 1: SQL 的子句结构

                  图 2: GQL 的线性语句组合





                  GQL 的前景

                  GQL 的首个版本已经具备了相当丰富的功能,这要归功于标准委员会成员的卓越贡献。
                  未来,我们可以期待更多激动人心的新特性,如子图提取、多样化的表构建方法、窗口函数,以及条件语句和 Lambda 表达式等。
                  作为一门现代化的高级数据查询语言,GQL 在功能和易用性上表现出色,尤其对电信和社交媒体等需要管理大规模网络的行业至关重要。其实时分析能力提供了即时洞察,对于动态环境下的决策至关重要。展望未来,GQL 的持续发展将改变我们与数据互动的方式,为人工智能、医疗保健、物流等领域的创新铺平道路。
                  总之,GQL 注定会革新数据管理,我们对其未来的进步充满期待。






























                  如果你觉得 NebulaGraph能帮到你,或者你只是单纯支持开源精神,可以在 GitHub 上为 NebulaGraph 点个 Star!每一个 Star 都是对我们的支持和鼓励✨

                  https://github.com/vesoft-inc/nebula



                  扫码添加

                   可爱星云 

                  技术交流

                  资料分享




                  NebulaGraph 用户案例集



                  案例推荐:

                  信息图谱在携程酒店的应用

                  智联招聘的推荐实践分享

                  知识图谱案例

                  Nebula Graph 在企查查的应用

                  腾讯音乐知识图谱搜索实践

                  中科大脑知识图谱平台建设及业务实践

                  苏宁基于 NebulaGraph 构建知识图谱的大规模告警收敛和根因定位实践

                  金融风控案例:

                  图数据库在中国移动金融风控领域的落地应用

                  图数据库 Nebula Graph 在 BOSS 直聘的应用

                  360数科:基于 NebulaGraph 打造智能化的金融反欺诈系统

                  NebulaGraph 助力金蝶征信产业图谱深挖企业关系链,实现银行批量获客

                  智能运维案例:

                  58 同城基于 NebulaGraph 一键部署运维架构的实践

                  苏宁基于 NebulaGraph 构建知识图谱的大规模告警收敛和根因定位实践

                  大数据/图平台:

                  图DB在微信的 应用

                  OPPO:通过 NebulaGraph 建设全局图数据库平台

                  vivo 大规模特征存储实践

                  美团图数据库平台建设及业务实践

                  百度爱番番实时CDP建设实践

                  数据治理:

                  微众银行:利用 NebulaGraph 进行全局数据血缘治理的实践

                  BIGO 的数据管理与应用实践

                  安全:

                  百亿级图数据在快手安全情报的应用与挑战

                  基于图的下一代入侵检测系统

                  NebulaGraph 助力奇安信威胁图谱分析系统获赛迪顾问颁发“新一代信息技术创新产品”奖


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

                  评论