dot Redis 8 已发布 - 并且是开源的

了解更多

RedisGraph 中知识图谱入门

知识图谱可以是一个简单的数据结构,代表我们对现实世界一部分的了解。例如,想象一下在你最喜欢的购物网站上搜索产品。你可能会搜索“闪光鞋带”,并希望看到任何与该特定术语匹配的鞋带产品。

但是,该网站如何知道显示其他鞋子部件或鞋子本身?一个简单的答案是匹配单个术语(例如“鞋子”)的产品。但是,作为对周围世界有知识的人,我们对这个特定的搜索选择了解很多,这有助于提供更好的响应。

这篇博文探讨了知识图谱的工作原理、它们在计算中的使用方式以及如何将它们与 Redis Enterprise 的 RedisGraph 模块一起使用。我们将简要探讨如何使用 Cypher 查询来访问知识图谱中的信息。最后,我们将讨论大规模使用知识图谱,并讨论它们的未来用途。如果您有兴趣构建知识图谱来增强您的机器学习应用程序,这是一个很好的起点。

搜索词是一种特殊的产品——一种带有涂层的鞋带——我们可以在知识图谱的本体中表示。虽然上面的图谱中可能有很多东西,但我已将其简化为两种关系:“是一种”(类别子类型)和“具有”(某物的一部分)。例如,鞋带是一种系带,是鞋子的一部分,并且具有涂层,或者带系带的鞋子具有鞋带。除了我们在图谱中编码的内容之外,该算法对世界没有任何先验知识。

当用户搜索“闪光鞋带”时,搜索算法可以识别本体中的直接匹配项。借助知识图谱,该算法现在可以理解这样的项目具有闪光涂层,并且是称为“鞋带”甚至“系带”(紫色箭头)的较大项目类别的一部分。它还可以遵循与“鞋子”的“具有”关系,以了解它是产品目录中较大项目的一部分。

当我们销售产品时,我们可以选择如何处理这些关系。虽然简单的选择是显示各种类别的鞋带,但也许我们想展示一个反模式:没有鞋带的鞋子!我们可以沿着“具有”路径返回到鞋子,并查询图谱中没有鞋带部分的商品(洋红色箭头),并将其显示为替代结果。

同样,也许消费者正试图更换损坏的鞋带,而我们最好向他们展示符合他们偏好的新鞋子。在我们的本体中,鞋子也具有涂层(橙色箭头),我们可以找到既有闪光鞋带又有闪光涂层的产品(也在橙色中)。也许他们更喜欢一款引人注目的新鞋,而不是更换那些损坏的闪光鞋带?

计算中的知识图谱

虽然在计算中使用图数据结构的技术已经存在很长时间了,但“知识图谱”一词是在2012 年由 Google 推广的。使用图作为表示知识的基础结构有着悠久的历史,从Web 的早期 RDF(1997 年)到现在,它经常用于机器学习 (ML)、自然语言处理 (NLP) 和搜索的各个领域。

知识图谱通常被概念化为捕获我们对特定领域的了解的一种方式。该图表示术语、关系以及事实和概念的实例。我们所知道的是表示为可以由算法处理的数据,而不是将知识编码为代码中编写的规则的算法。

这种将知识表示为图中的数据的表示是一个重要的区别,这使得在机器学习中将知识图谱用于搜索和模型推理非常重要。我们可以对世界了解到的内容可以被编码并随着我们学习而随着时间的推移而改变,而不必重写我们所有的软件组件。反过来,模型可以通过在知识图谱中编码的信息上不断地重新训练来学习。对于数据规模庞大且不断增加的应用,这个周期变得越来越重要。

RedisGraph 入门

Redis Enterprise 的RedisGraph模块可以帮助在构建知识图谱基础设施时加载和使用本体。本体的结构变成一组带有标签的图节点和边,可以通过 Cypher 查询,也可以通过RediSearch搜索。一个简单的本体用例——例如查找一个被引用的术语,并使用图中的关系来跟踪图的边以查找同义词、超类或其他相关术语——可以简单到只有一个 Cypher 查询。

例如,对于生物学/生物医学领域,在开放生物学和生物医学本体 (OBO) Foundry中,有社区开发的本体可用。这些本体以 OBO 和OWL格式提供,涵盖了各种领域。鉴于当前的大流行,让我们来看看冠状病毒传染病本体

还有一个名为pygobo的 Python 库,是我开发的,用于将 OBO 本体读取和转换为可与 RedisGraph 一起使用的属性图。冠状病毒传染病本体以 OWL 格式分发,因此一旦我们将其转换为 OBO 格式,我们就可以加载本体并查看其结构。

让我们通过启动本地 RedisGraph 实例来看看这个本体:

% docker run -p 6379:6379 redis/redisgraph

然后我们可以加载本体,这里在本地称为“cido.obo”

% pip install pygobo
% python -m pygobo load cido.obo --graph cido

完成此操作后,本体已加载到名为“cido”的图中。此图的结构已记录在 GitHub 上,但这里有一个简单的摘要:有标记为 Ontology 和 Term 的节点,本体具有“term”关系,并且术语通过“is_a”关系相互关联。例如,我们可以用以下方式查询术语“抗病毒药物”:

MATCH (r:Term) WHERE r.name='antiviral drug' RETURN r

一个更有趣的查询是检索与“is_a”关系的一定深度内的抗病毒药物相关的整个术语层次结构。

MATCH (r:Term) WHERE r.name='antiviral drug'
MATCH p=(:Ontology)-[:term]->(:Term)<-[:is_a*1..3]-(r)
RETURN p

下面的RedisInsight可视化显示了此查询中返回的所有路径的关系。在图像的右下方是我们选择作为根的“抗病毒药物”节点。在中间是本体节点。节点之间的黄色箭头显示了术语之间的“is_a”关系。最后,灰色箭头显示了本体节点和术语节点之间的术语关系。

在可视化中,我们可以从右角的“抗病毒药物”节点沿着“is a”关系到“抗病毒剂”和“抗菌药物”。这两者都导致“抗菌剂”。通过一个简单的查询检索到的这个子图为我们提供了一个不断扩展的类别集合,并让我们理解了“is a”关系。如果我们想搜索特定药物的替代治疗方法,遍历这些关系可以让我们发现更大的类别或替代类别。

请注意,本体本身没有实例数据。也就是说,没有标记为“抗病毒药物”的药物。如果我们想将此本体与药物数据库一起使用,我们只需包含术语节点的标识符(即“id”属性),该标识符保证是一个唯一值。然后可以使用查询从药物数据库中的结果导航到本体中。

例如,如果药物数据库标记有“CHEBI:36044”(抗病毒药物),这个简单的查询将发现超类术语“CHEBI:22587”(抗病毒剂)和“CHEBI:36043”(抗菌药物)

MATCH (r:Term) WHERE r.id='CHEBI:36044'
MATCH (t:Term)<-[:is_a]-(r)
RETURN t.name,t.id

这些术语可以用作额外的搜索参数,以扩展来自药物数据库的搜索结果。 虽然非常简单,但这种本体推理使数据库搜索算法独立于术语组织。

大规模使用知识图

正如我们在零售和医疗示例中所展示的那样,知识图是机器学习在搜索和推理中各种可扩展应用的重要信息资源。 知识图可用于将本体的手工策划方面扩展到与本体内项目相关的数据实例。 数据实例通常由人工或通过算法自动使用本体中的术语进行注释。 

例如,基因本体已被用于注释PubMed中的文章,以便搜索算法可以将逻辑推理应用于关于基因功能的本体术语。 使用本体术语标记 PubMed 中的摘要将分类从本体扩展到有关文章的元数据。 然而,这最初主要是通过人工注释和标签管理来完成的。

将本体扩展到实例数据的结果使得结果成为知识图——它在一个大型图中包含数据和关于数据的信息。 这里的挑战是以可扩展的方式进行此类分析。 人工管理数据注释,虽然在某些情况下非常重要,但无法扩展到现在正在创建的大量数据。

在处理大量数据时,通过机器学习进行推理、通过自然语言处理进行文本分析以及通过人工管理的信息注释(即schema.org注释)从 Web 收集数据,所有这些都允许将各种数据存储在知识图中并进行分类。 处理的大规模数据使算法能够通过从图中实例数据到本体术语,再到另一组相关数据,从特定实例导航到非常大的相似项目集。 本体中的术语和关系使我们能够了解两个特定项目如何作为非常大的信息集的一部分彼此相关。

可扩展性的关键点在于知识图的本体部分远小于实例数据。 我们可以轻松地将本体存储在 RedisGraph 中,无论是作为单个图还是多个图,并使用 Redis 或其他位置的其他数据结构来存储实例数据。 没有必要对实例数据使用基于图的表示,这些数据可能已经是表格形式。

从这些构建块中,我们可以构建用于搜索的算法,向服务的用户提供推荐,或者为专家提供总结和跟踪大量信息中的关系的方式。 仔细构建知识图可以让系统支持专业人员(例如,在临床环境或药物开发中),其中信息的分类对于正确的结果很重要。

后续步骤和可能性

实例数据的规模可能太大,无法实际存储在图形结构中。 幸运的是,知识图不必完全以图形形式实现。 例如,实例数据可以存储在可扩展的表格数据存储中,在那里可以很容易地使用术语注释对其进行扩充。 特别是,表格数据也可以与通过 RedisGraph 存储的相关本体一起存储在 Redis 中。

带有术语注释的表格数据的查询结果可以被算法用来查找本体中的匹配术语。 正如我们之前看到的,本体中的匹配项形成了信息的子图。 我们可以使用此子图作为模型推理输入。 随后,模型推理的输出可以直接使用或用于其他查询。 各种查询和推理的组合创建了一个具有原子查询属性的强大而灵活的系统。

我们还可以使用 RedisGraph 的 RediSearch 功能查询本体,以对术语名称、描述和关系进行全文搜索。 一旦确定了候选术语,我们就可以使用相同的技术,使用本体中的子图作为查询先前存储在 Redis 中的数据的机制。 例如,我们可以找到一个用全文搜索中的匹配术语之一注释的表格行。 本体为我们提供了一种特定于域的方式来过滤搜索结果。

此处讨论的技术都使用单个本体。 RedisGraph 可以在单个更大的图中或作为单独键下的单独图存储多个本体和其他图形结构。 这种灵活性允许通过大型数据管道中不同图形组件的组合来创建算法。

在 Redis 中实现和使用知识图的可能性非常广泛。 您可以通过 DockerRedis Enterprise 或我们的 Redis Cloud Pro 服务在 RedisGraph 上试用本体和知识图。