dot 未来的速度将在你所在的城市举行活动。

加入我们在 Redis 发布会

在 RedisGraph 中开始使用知识图谱

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

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

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

搜索词是一种特定类型的产品——一种带有涂层的鞋带——我们可以在知识图谱中使用 本体来表示。虽然上面这个图谱看起来有很多事情在发生,但我已经将其简化为两种关系:“”(类别子类型)和“”(某事的一部分)。例如,鞋带是一种系带,是鞋的一部分,有涂层,或者系带鞋有鞋带。除了我们编码在图谱中的内容之外,算法没有先验的关于世界的知识。

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

当我们推广产品时,我们有很多选择可以利用这些关系。虽然最简单的选择是显示各种类别的鞋带,但我们也许想显示一个反模式:没有鞋带的鞋!我们可以沿着“有”路径回到鞋子,并查询图谱以查找没有鞋带部件的产品(品红色箭头),并将此显示为替代结果。

同样,也许消费者正在尝试更换破损的鞋带,而我们最好向他们展示与他们喜好相符的新鞋。在我们的本体中,鞋也有涂层(橙色箭头),我们可以找到同时具有闪光鞋带和闪光涂层的产品(也是橙色)。也许他们更愿意一双华丽的新鞋,而不是更换那些破损的闪光鞋带?

计算中的知识图谱

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

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

这种将知识作为图中数据的表示是一个重要的区别,它使知识图谱在机器学习中的搜索和模型推理中变得很重要。我们对世界的了解可以被编码并随着我们学习而随着时间的推移发生改变,而无需重新编写所有软件组件。反过来,模型可以通过不断地对编码在知识图谱中的信息进行再训练来学习。对于数据规模庞大且不断增长的应用程序来说,这种循环变得越来越重要。

开始使用 RedisGraph

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

例如,对于生物学/生物医学领域,在 开放生物学和生物医学本体 (OBO) 基金会中提供了社区开发的本体。这些本体以 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标注)从网络中收集数据,都允许将各种数据存储并分类到知识图谱中。处理数据的规模允许算法通过从图中的实例数据遍历到本体术语,再到另一组相关数据,从一个特定实例导航到一组非常相似的项目。本体中的术语和关系让我们了解两个特定项目作为一组非常大量的信息的一部分如何相互关联。

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

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

下一步和可能性

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

来自包含术语标注的表格数据的查询结果可以被算法用来在本体中查找匹配的术语。正如我们之前所见,本体中的匹配构成信息的一个子图。我们可以将这个子图用作模型推理输入。随后,模型推理的输出可以直接使用,或用于额外的查询。各种查询和推理的组合创建了一个具有原子查询属性的强大而灵活的系统。

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

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

在 Redis 中实现和使用知识图谱的可能性非常广泛。您可以在 RedisGraph 上尝试本体和知识图谱通过 Docker,使用Redis 企业版,或在我们的Redis 云专业版服务上。