13594780322

加密货币,让财富增值再简单不过!

在知识图中使用 Amazon Neptune 查找和链接相似实体,第二部分:向量相似度搜索 数据库博

在知识图中使用 Amazon Neptune 查找和链接相似实体,第二部分:向量相似度搜索 数据库博

发表时间:2026-01-27

浏览次数:12

使用 Amazon Neptune 查找和链接知识图谱中的相似实体:第二部分:向量相似性搜索

关键要点

在这一部分中,我们将探讨如何利用 Amazon Neptune 的向量相似性搜索功能来查找知识图谱中的相似实体。通过机器学习模型生成的向量嵌入,我们可以实现语义搜索,从而识别和链接意思相似的实体。

知识图谱 (Knowledge Graph) 综合了来自多个来源的数据,并链接相关实体。由于知识图谱是连接数据的汇聚点,我们预计许多实体之间存在相似性。当我们发现两个实体彼此相似时,可以将这一事实转化为它们之间的关系。

在这两部分系列文章中,我们展示了如何在 Amazon Neptune 上查找和链接相似实体,这是一种受管的图数据库服务。在 第一部分 中,我们使用字面搜索来查找文本相似的实体。在本篇文章中,我们使用语义搜索来查找具有相似含义的实体。在这两种情况下,我们都展示了一种通过边缘连接相似实体的常规方法。

语义搜索

语义搜索 是指能够找到具有相似意义的实体。这种方法利用机器学习 (ML) 模型生成实体的数字向量嵌入。一个 向量 是一系列数字,每个数字都编码了实体意义的某些方面。模型为意义相似的实体创建相似的向量。如果我们将向量绘制在图上,向量之间越接近,表示它们的相似性越高。向量数据库允许我们存储向量并对其进行距离或相似性查询。

为了演示语义搜索,我们使用一个出版物数据集,具体是 DBLP ACM 数据集,该数据集包含来自计算机科学出版源如 DBLP 和 ACM (美国计算机协会) 的引用数据。我们图的数据模型如下一图所示。

我们维护 Publication 节点和 Author 节点。我们通过 hasAuthor 边将出版物链接到其作者。出版物节点具有多个属性,包括 title、venue、year 和 source值为 DBLP 或 ACM。为了便于对出版物的比较,我们将嵌入关联到每个出版物。由于各种原因,出版物中存在许多重复,例如具有相似标题和来自不同来源的相同作者。前面的图展示了标题相似但来源不同的出版物,它们共享相同的三位作者。

在下图中,我们可以看到两个标题在字面上并不相似,但其主题类似。Tetanus 和 lockjaw 指的是同一种疾病;emerge 和 ER 是同义词。因此,我们期望它们的嵌入相似。为了链接这些出版物,我们还进行附加验证,包括对作者的比较。

需要注意的是,整体数据集是公开的,但这两个出版物是模拟出版物。我们将它们添加到数据集中进行测试。

梯子vp

我们使用 Neptune Analytics,这是一种面向图分析的内存优化图引擎。我们首先利用预训练的双向编码器表示 (BERT) 句子变换模型生成嵌入。然后,我们将出版物数据和嵌入填充到 Neptune Analytics 图中。我们使用 Amazon SageMaker 笔记本实例作为客户端查询 Neptune 图以解析实体。

要运行本示例,您需要一个 Neptune Analytics 图和一个笔记本实例。请遵循 FindAndLinkVSSipynb 中的步骤来探索出版物之间的语义相似性。该笔记本包含设置说明。

创建嵌入

接下来,让我们看看一些重点。首先,我们使用以下代码来创建嵌入:

pythonfrom sentencetransformers import SentenceTransformermodel = SentenceTransformer(sentencetransformers/allMiniLML6v2)

sentences 一句或多句文本

def getembeddings(sentences) embeddings = modelencode(sentences) return embeddings

将嵌入转换为半角分号分隔的列表,以便于载入 Neptune 格式

def getstrembedding(embedding) return join([str(x) for x in embedding])

getembeddings 函数接收一个文本片段或文本片段列表并返回一个向量如果传入的是文本片段列表,则返回向量列表。它使用 Sentence Transformers 库。片段不必构成一个完整的句子,我们在处理出版物标题时也是这样使用的。getstrembedding 函数将向量转换为字符串格式,便于加载到 Neptune Analytics 中:一个由半角分号分隔的数值列表。

我们创建了三个 CSV 文件,以便 加载 到 Neptune 图中:出版物、作者和 hasAuthor 边。以下是出版物 CSV 的一段示例。

在出版物 CSV 中的每一行代表一个单独的出版物。注意右侧列是通过句子变换器生成的出版物标题的字符串嵌入。

topKByNode

现在,我们可以使用 topKByNode 函数相互比较出版物节点。Neptune Analytics 支持 OpenCypher 查询语言。以下是调用 topKByNode 的 OpenCypher 查询示例:

cypher// 1 根据 ID 查找候选出版物。同时查找相关的作者。// 我们将候选出版物称为 p,相关作者称为 pa。MATCH (pPublication)[hasAuthor]gt(paAuthor)WHERE id(p)=candidate

// 2 查找其嵌入与 p 相似的出版物节点。// 返回匹配的节点和分数CALL neptunealgovectorstopKByNode(p)YIELD node score

// 3 保存候选ID、标题、作者姓名、匹配节点和分数WITH id(p) as candidate ptitle as candidateTitle collect(paname) as candidateAuthors node score

// 4 获取匹配节点的相关作者 naMATCH (node)[hasAuthor]gt(naAuthor)

// 5 返回候选出版物及匹配数据进行比较RETURN candidate id(node) as matched candidateTitle nodetitle as matchedTitle scorecandidateAuthors collect(naname) as matchedAuthors

// 6 按分数排序,较低的分数表示匹配更好。// 默认升序排序。ORDER by score

正如注释所示,有六个步骤:

查找候选出版物我们想与之比较的出版物及其相关作者。调用 topKByNode 查找其嵌入与候选出版物相似的出版物。追踪候选出版物和匹配出版物,以及相似性分数。查找匹配节点的相关作者。返回候选出版物、候选作者、匹配出版物、匹配作者和分数。按分数排序结果。

仅仅依靠向量相似性不足以比较出版物。我们还需要检查图中的共同关系。例如,若我们查找与 Design and findings and next steps for Java implementation of Telegraph Dataflow 相似的出版物,我们会发现 Java support for dataintensive systems experiences building the telegraph dataflow system 但这两篇出版物有不同的作者,因此不太可能是匹配项。

然而,若我们查找与 Tetanus cases increase Emerg units in September 相似的出版物,我们找到的 ER staff reports lockjaw diagnoses rose 5 percent after Labor Day 与之一致,且拥有相同的作者。这并不能保证它们是相同的出版物,但这类推断的概率更高。

topKByEmbedding

我们可以使用 topKByEmbedding 函数找到与搜索词相似的出版物。例如,若想找到与 Tetanus cases September 相似的出版物,我们首先为该词组生成嵌入。我们使用与节点嵌入相同的句子变换:

在知识图中使用 Amazon Neptune 查找和链接相似实体,第二部分:向量相似度搜索 数据库博

pythonembparams={emb getembeddings(Tetanus cases September)tolist()}

然后,我们使用 topKByEmbedding 查找与相似嵌入出版物。对于匹配的节点,我们还要查找相关作者:

cypherWITH emb as emb

CALL neptunealgovectorstopKByEmbedding(emb)YIELD embedding node scoreWITH node score embedding

MATCH (node)[hasAuthor]gt(aAuthor)RETURN id(node) as matched nodetitle as matchedTitle score collect(aname) as authorsORDER by score

正如我们之前讨论的,这些顶级匹配项是语义上相似但在字面上并不相同。

该笔记本还演示了如何生成出版物之间的匹配关系,因为我们认为它们是语义相似且作者相同的重复项。要手动链接节点 http//exampleorg/pubgraph/ACM/604282 和 http//exampleorg/pubgraph/DBLP/journals/sigmod/ShahMFH01,并使用 matches 边,使用以下 OpenCypher 查询:

cypherMATCH(p1)WHERE id(p1)=http//exampleorg/pubgraph/ACM/604282

MATCH(p2)WHERE id(p2)=http//exampleorg/pubgraph/DBLP/journals/sigmod/ShahMFH01

CREATE (p1)[ematches {matchSource user matchAlg vss}]gt(p2)RETURN e

这遵循与患者相同的链接惯例。

Amazon OpenSearch 服务中的语义搜索

Amazon OpenSearch 服务 也提供了语义搜索。您可以将嵌入加载到 OpenSearch 域中的 K 最近邻kNN索引中,并对该索引执行向量相似性查询。即将在下一篇文章中,我们将结合 Neptune 使用此功能。

其他方法

搜索的替代方案包括以下几种:

去重 将相似实体分批分组,通常作为提取、转换和加载 (ETL) 过程中进行。去重通常用于主数据管理 (MDM),帮助查找黄金记录。它可用于在将重复实体加载到 Neptune 数据库之前发现和链接它们。 Amazon 实体解析 是提供去重的 AWS 服务。图相似性算法,在 Neptune Analytics 中可用,基于交集关系找到相似的图节点。以下 示例笔记本 演示了在航线图中 Jaccard 相似性的算法。Neptune ML 利用当前图中的数据训练一个 ML 模型在 SageMaker 中做进一步的预测。特别地,Neptune ML 提供 链接预测,即预测节点之间的边。您可以利用此功能找到相似实体,例如,通过预测它们之间的连接。由于 Neptune ML 模型生成嵌入,您可以在 Neptune Analytics 图中针对这些嵌入执行向量相似性搜索!值得注意的是,嵌入是图意识的。节点的嵌入不仅表示节点的属性,还表示节点在图中的邻域。拥有相似的 GNN 嵌入的节点在图形上是相似的。

清理

如果您为跟随本文设置了 Neptune Analytics 图或笔记本实例,请删除这些资源以避免进一步的费用。笔记本提供了清理说明。

结论

知识图谱汇集了来自多个来源的实体。在本篇文章中,我们演示了如何在 Neptune Analytics 中使用向量相似性搜索查找语义相似的实体。我们还展示了一种链接相似实体的常规方法。

在 第一部分 中,我们展示了如何使用字面搜索在 Neptune 上查找相似实体。我们结合使用 Neptune 和 OpenSearch 服务,利用全文搜索功能。

请使用提供的笔记本中的方法进行实验。考虑如何更有效地查询并在您的知识图谱中建立关系,并在评论区分享您的想法。

关于作者

Mike Havey 是 AWS 的高级解决方案架构师,拥有超过 25 年构建企业应用的经验。他是两本书籍和众多文章的作者。他的 Amazon 作者页面是 https//wwwamazoncom/MichaelHavey/e/B001IO9JBI。