Redis 是一款 NoSQL 数据库,支持用户使用各种数据结构存储各种数据。我们发现,我们的客户需要创建高度互联的数据并利用图形学进行分析。最初于 2018 年发布,RedisGraph就是这一需求的成果。
RedisGraph 基于一种独特的技术与架构,该架构将 Cypher 查询语言转换成在 基于 GraphBLAS 的引擎上执行的矩阵运算。RedisGraph 使用稀疏矩阵表示图形,并利用 GraphBLAS 处理这些矩阵,提供了一种快速有效的方式来管理和处理图形数据,已证明在一些应用中具有较大的优势。
自 RedisGraph 1.0 发布以来,该项目已累积 1,000 个 GitHub 星标和超过 100,000 个 Docker 拉取。在那段时间,我们也在努力构建下一版本,我们很高兴地宣布推出 RedisGraph 2.0,该版本旨在实现 RedisGraph 1.0 对我们最重要的客户领域做出的承诺。图形数据库可以支持从 资源管理到 健康照护的各种用例。我们一直努力支持资源管理、欺诈预防、图形辅助搜索以及知识图形所需的查询。
从 1.0 版本起,RedisGraph 获得的增强功能已太多,无法在此处全部列出。我们将通过以下示例总结这些增强功能:改进对 Cypher,完整图形响应以及集成 RediSearch以在图形上进行全文搜索。我们还将详细介绍对 RedisInsight的增强功能,以支持图形,并推出两个 RedisGraph 合作伙伴: Linkurious和 Graphileon。
要了解 RedisGraph 2.0 中的重大性能增强功能并获取更多关于基准测试流程的信息,请查看 RedisGraph 2.0 性能基准测试.
RediSearch 1.6 版本的发布中新增了一个低级 API,使用该 API,其他模块可以消费 RediSearch 来辅助索引和执行全文搜索目的。RedisGraph 2.0 是第一个充分利用此功能的公开可用模块。在此版本之前,RedisGraph 通过跳跃表提供索引功能,该功能性能相当好,但是仅限于完全匹配,并且不允许前缀或模糊匹配。此外,没有办法对给定标签中的两个单独索引作为复合索引进行利用。
RedisGraph 2.0 支持对属性值执行全文搜索。可以针对特定节点和属性组合创建索引:
CALL db.idx.fulltext.createNodeIndex('Person','name')
然后可以通过 Cypher 来查询,如下所示
CALL db.idx.fulltext.queryNodes('Person','Bob')
YIELD node AS p
RETURN p.name
在 CALL 表达式中,可以是各种的 Cypher 表达式。返回的节点可以与 match 表达式结合使用,以进一步限定搜索结果。使用图的关系扩充搜索结果被称为图辅助搜索。
图辅助搜索的一个示例是查找与某个人有特定数量间接关系的人。一个常见的示例是 LinkedIn 上的搜索功能,与您关系更密切的人员会列在搜索匹配项的顶部。
以下查询演示了如何实现这一点
CALL db.idx.fulltext.queryNodes('Person','%yif%') YIELD node
匹配 p=(节点)-[:已连接*1..3]->(:人物 {名称:'Pieter'})
返回 p.名称, p.标题, 长度(p) 作为 关联度
按 关联度 升序排列限制 20
RedisGraph 2.0 现在不仅可以返回属性值的表格结果,还可以返回节点、关系和其他数据类型。例如,以前只能返回表格结果(例如,属性值)
匹配 (我:人物)-->(朋友:人物)-->(fof:人物)
其中 我.名称='Pieter'
返回 朋友.名称, fof.名称
使用 全图响应,即可直接返回节点和关系。例如,之前的查询可以返回朋友、朋友的朋友以及他们之间的关系:
匹配 (我:人物)-->(朋友:人物)-[f:朋友]->(fof:人物)
其中 我.名称='Pieter'
返回 朋友, f, fof
这项新功能实现了诸如对象图映射 (OGM)、查询子图以及可视化(接收应用程序需要所有节点及其关系)等用途。
为了展示这种完整图响应功能的强大之处,我们希望展示一些 RedisInsight 集成,以及此功能支持的与 Linkurious 和 Graphilean 的合作。
RedisInsight 中的 RedisGraph
其中一款运用就是RedisInsight,用户现可输入一个查询并收到可视化显示(如下所示)。完整图响应能使 RedisInsight 呈现可视化显示,并允许检验查询返回的所有节点和边属性,而无需事先知道这些属性。
RedisInsight 1.2直接支持探索和查询存储在 Redis 中的图形。支持完整图响应使 RedisInsight 能够将查询子图直接以可视化方式呈现在用户面前。随后,用户可以在图形中单击节点和边来检验属性值或进一步扩展图形。
Linkurious
Redis 与法国软件开发商Linkurious合作,后者提供一家企业平台Linkurious Enterprise用于通过图形分析来抵御欺诈、洗钱和网络威胁。Linkurious 已经开发出OGMA库,该库为 RedisInsight 中的可视化提供支持。该库使用户可以直观地与存储在 RedisGraph 中的图形进行交互。
此外,RedisGraph 2.0 中现有的完整图响应允许与 Linkurious 的图形可视化和分析平台进行集成。我们期待在未来进一步加深整合。
此外,RedisGraph 2.0 中现有的完整图响应允许与 Linkurious 的图形可视化和分析平台进行集成。我们期待在未来进一步加深整合。
Graphileon
2020 年 1 月 27 日,Redis 与荷兰软件公司Graphileon宣布建立合作伙伴关系,使用户能够在 Graphileon 的高级图形化工具中管理自己的数据和构建应用程序。RedisGraph 与 Graphileon 的结合使得我们的客户能够享受快速且简单的数据管理,并利用 Cypher 查询语言的强大功能查询和分析数据,同时利用 RedisGraph的特定优势。
RedisGraph 2.0 添加的 Cypher 增强功能列表 真的很长。其中值得注意的增强功能包括多种操作符和函数、对简单 case 语句的支持、增强的合并支持、聚集计数、对路径命名的支持以及在模式匹配中重复使用实体。在博客文章中对所有增强功能进行解释是不可能的,因此我们来看一下三元闭包的一个示例,以突出显示一些最有趣的增强功能。
对合并、路径和操作符的改进支持能够为图操纵提供新的支持。我们可以在两个不相关节点之间跟随特殊共享关系,推断出一种新的关系。例如,如果两个人认识同一个人,社交媒体服务可能会建议他们认识一下。同样,如果两个人是由同一个人管理的,那么他们在组织中就是同事。计算这些新关系的过程便是三元闭包的示例。
考虑一下下面的两个图。左边的图显示“朋友”关系(例如谁认识谁)。右边的图显示一种组织结构(例如谁管理谁)。在这两个图中,“B”和“C”节点之间的关系都不出现在图中。
我们可以在左边的图中通过跟随“KNOWS”关系查找建议的介绍
MATCH (b:Person)-[:KNOWS]->(a:Person)-[:KNOWS]->(c:Person)
WHERE NOT (b)-[:KNOWS]-(c) AND b <> c
RETURN b, c
此查询会通过 A 节点,从节点 B 到节点 C 追溯“KNOWS”关系,但它要求我们想要的节点不通过“WHERE NOT”子句具有现有关系(或周期)。
在右边的图中,我们可以通过找到一条路径(其中我们有两个人共同管理且不存在现有同行关系)来创建一个同行关系(通过 MERGE)
MATCH (b:Person)<-[:MANAGES]-(a:Person)-[:MANAGES]->(c:Person)
WHERE NOT (b)-[:PEER]-(c) AND b <> c
MERGE (b)-[:PEER]-(c)
我们可以通过为边添加角色和方向进一步限定关系
MATCH (b:Person)<-[:MANAGES]-(a:Person)-[:MANAGES]->(c:Person)
WHERE NOT (b)-[:PEER]-(c) AND b <> c
WITH b, c,
CASE b.level
WHEN 'Director' THEN 'mentor'
ELSE 'peer'
END AS role
MERGE (b)-[:PEER {role:role}]->(c)
在未来的几个月里,敬请关注 Redis 博客,了解有关 RedisGraph 2.0 新特性的更详细示例。我们还致力于提升 RedisGraph 性能,扩大 Cypher 覆盖范围(如 OPTIONAL MATCH),并通过开源LAgraph算法集合在即将到来的版本中为 GraphBLAS 添加图算法。
RedisGraph 2.0 可通过 Docker、Redis Enterprise Software(RS) 5.4.14以及 Redis Cloud Pro获得。如果您尝试过 RedisGraph 1.0,请查看最新版本以了解新增内容和改进之处。如果您对图数据库感兴趣,请考虑 RedisGraph 2.0 的强大功能。如果您是新接触图数据库的 Redis 用户,现在正是了解 RedisGraph 能为现有应用程序带来哪些优势的好时机。