在知识图谱中使用 Amazon Neptune 查找并链接相似实体,第一部分:全文本搜索 数据库博客
使用 Amazon Neptune 在知识图谱中查找和关联相似实体:全文搜索
关键要点
知识图谱汇集了多个来源的数据并关联相关实体,通过相似性搜索,我们可以识别和链接这些实体。本篇文章展示了如何使用Lexical Search词汇搜索在Amazon Neptune中查找相似实体,并将在后续文章中引入语义搜索。通过结合使用Amazon Neptune和Amazon OpenSearch Service,我们能够实现高级的搜索能力和进行实体匹配。示例查询演示了如何使用Gremlin查询语言进行相似性搜索。在知识图谱中,多个数据源组合而成,并关联相关实体。由于知识图谱常常包含彼此相似的实体,因此当我们发现两个实体是相似的时,可以将这种关系表现为它们之间的链接。
在这篇系列文章的第一部分,我们将展示使用Amazon Neptune一种托管图数据库服务查找和链接相似实体的方法。本文侧重于利用词汇搜索功能查找文本相似的实体。在第二部分中,我们将利用语义搜索查找具有相似含义的实体。在这两个部分中,我们都将演示一种使用边缘来链接相似实体的常规方式。
为什么要进行相似性搜索?
Neptune和大多数数据库一样,可以使用基本的字符串比较,如完全匹配和部分匹配。但我们通常需要更高级的搜索能力,例如模糊比较例如,即使名字有拼写错误也能找到人物或语义比较例如,即使使用不同的词语,也能找到某一特定主题的出版物。有时,我们需要更强大的搜索方式。
这种能力可能是为了从应用程序中按需查询图,也可能是为了将相关或重复的实体进行链接。虽然有专门的去重工具可以在数据加载到数据库之前检测并消除重复项,但在知识图谱中,相似实体不可避免。因此,相似性搜索是一种有效的工具来查找这些相关实体。同时,当发现相似实体时,我们可以遍历图来比较它们之间的关系。共享的邻接节点进一步证明了这些实体之间的关联性。
词汇搜索
词汇搜索是指能够查找内容相似的实体。例如,名字拼写相似同时具有相同出生日期和邮政编码的患者可能被视为相同。
在进行词汇相似性匹配时,我们可以在患者图中匹配患者实体。我们将Neptune与Amazon OpenSearch Service结合使用。OpenSearch Service是一种强大的搜索索引服务,支持以下功能:
完全和部分文本匹配、模糊匹配、同义词、提升、突出显示和词干提取词汇和语义搜索根据相关性评分匹配和排序结果通过REST API或OpenSearch Ingestion从数据源如Amazon S3、Kafka和Amazon Kinesis等摄取数据我们利用Neptune/OpenSearch的集成功能,名为全文搜索FTS,实现对图数据的高级词汇搜索。全文搜索使用轮询器将数据从Neptune数据库同步到单独的OpenSearch Service集群。有关支持的OpenSearch版本及Amazon OpenSearch Serverless兼容性的详细信息,请参考Amazon Neptune中的全文搜索。该轮询器是一个AWS Lambda功能,定期运行并检查Amazon Neptune Streams,即Neptune事件日志,以查找Neptune数据的最新更改。当Neptune数据发生变化时,Lambda函数便会更新OpenSearch Service域中的索引,维护Neptune节点和边缘的JSON表示,从而使您能够按属性进行搜索。以下图表展示了此工作流程。
全文搜索还允许对Neptune和OpenSearch Service进行组合查询,如下图所示。在对Neptune数据库的查询中,应用程序可以隐式从OpenSearch Service中获取与特定条件词汇匹配的节点、边缘或资源。然后,该查询可以进一步遍历以查找其他详细信息。
组合查询使您可以通过一次交互查找与给定模式相似的患者姓名,并在图中遍历以查找相关的支付者、接触和提供者详细信息,从而进一步验证匹配情况。您可以在两种情况下使用此方法:将新患者与档案中现有患者进行匹配,或将现有患者进行匹配和链接。
为了测试患者匹配,我们提供了示例笔记本FindAndLinkFTSipynb。该笔记本中包含了在Neptune中设置全文搜索、填充患者数据集及查询的说明。此设置会产生运行Neptune集群和OpenSearch Service域的费用。
Neptune支持两种常见的图表示:标记属性图LPG和资源描述框架RDF。本文主要集中在LPG上。对于患者匹配,我们使用Apache TinkerPop Gremlin查询语言来查询患者数据。
飞机加速官网以下图表展示了患者图数据模型。患者数据为合成数据,来源于https//syntheamitreorg/downloads。
让我们逐步了解该模型:
图由节点和边构成。节点用方框表示,而边用箭头连接。节点包括Patient患者、Encounter接触、Payer支付者、Organization组织和Provider提供者。患者可以拥有接触hasENCOUNTER边和支付者hasPAYER边。患者可能会随时间变换支付者。边的属性STARTYEAR和ENDYEAR指定患者与特定支付者的关系周期。此外,每个接触可以有提供者和组织分别由hasPROVIDER和hasORGANIZATION边表示。最后,患者可以与另一患者匹配;matches边连接患者,并带有边缘属性matchSource和matchAlg,表示源和所使用的算法。基本患者匹配
以下Gremlin查询在Neptune中运行,以查找姓氏与prosecco相似的患者:
gremlingwithSideEffect(Neptune#ftsendpoint{AOSENDPOINT}) V()hasLabel(Patient)has(LASTNeptune#fts prosecco)elementMap(LAST)
在笔记本中,结果如下所示。
全文搜索支持对属性图查询的Gremlin以及对RDF查询的SPARQL。
让我们分解一下该查询:
副作用Neptune#ftsendpoint告诉Neptune引擎使用哪个OpenSearch Service域端点。V()hasLabel(Patient)对Neptune数据库进行查询,限制搜索到图中的Patient节点。在has(LASTNeptune#fts prosecco)中,Neptune向OpenSearch Service域查询符合条件的JSON文档以查找匹配这个姓的最后一名患者。波浪号指示OpenSearch Service使用模糊匹配。Neptune为每个节点在OpenSearch Service域中的专用索引中存储一个JSON文档,维持每个节点属性作为文档的一个属性。这一步返回与匹配文档对应的节点。elementMap(LAST)提取匹配患者节点的姓属性,以及节点ID和标签。多个患者节点的姓氏匹配Prosacco,与prosecco是模糊匹配。
更高级的患者匹配
更高级的搜索可以查找姓氏或婚前姓名与havey或town相似的患者。针对每个匹配的患者,它还获取该患者的接触和支付者。查询字符串使用Apache Lucene语法来检查LAST或MAIDEN是否匹配模糊名称:
plaintextquerystring=Neptune#fts predicatesLASTvalue(havey OR town) OR predicatesMAIDENvalue(havey OR town)
以下是对应的Gremlin查询:
gremlingwithSideEffect(Neptune#ftsendpoint {AOSENDPOINT})withSideEffect(Neptune#ftsqueryType querystring)withSideEffect(Neptune#ftssortOrder desc)V()hasLabel(Patient)has( {querystring})project(patient encounters payers)by(elementMap())by(out(hasENCOUNTER)elementMap()fold())by(outE(hasPAYER)as(pt)inV()as(payer)select(pt payer)by(elementMap())fold())
该查询包括以下内容:
withSideEffect(Neptune#ftsqueryType querystring)指示Neptune在提交查询时使用OpenSearch的querystring。该查询使用Apache Lucene语法。withSideEffect(Neptune#ftssortOrder desc)指示Neptune按降序对OpenSearch Service的结果进行排序。默认情况下,结果按得分排序。V()hasLabel(Patient)从限制查询开始,仅在Neptune中查询Patient节点。has( {querystring})执行OpenSearch Service查询,返回符合给定姓名或婚前姓名的Patient节点。project带回每个匹配患者的接触和支付者。这个查询非常适合在图数据库中将入院患者与其他患者进行匹配。查询返回许多结果,但我们可以询问患者进一步的详细信息,包括个人资料、支付者和接触就诊的细节,以缩小范围。例如,如果患者指出他们曾有高脂血症的接触,我们可以过滤结果并检查是否为Lori TowneHarvey。
该笔记本显示姓名匹配的113个结果,但如果我们筛选高脂血症,则只有13个匹配。
让我们更详细地检查第一个匹配的患者。我们看到,该患者的姓名符合我们的查询标准:
plainFIRST Lori LAST Harvey MAIDEN Towne
该患者还对应于高脂血症的接触:
json{ ltTid1gthttp//exampleorg/patientgraph/encounter/4dfe5224d1664423b84da61d8d6c72fe ltTlabel4gtEncounter Id4dfe5224d1664423b84da61d8d6c72fe START19890111T144428Z STOP19890111T145928Z PATIENT37962cbc310b486b85b1febe07eda766 ORGANIZATION24cb4eab61663530bddca5a8a14a4fc1 PROVIDERe9f54a4ec20e3443a6fc2ab488a1345c PAYER6e2f1a2d27bd37018d08dae202c58632 ENCOUNTERCLASSambulatory CODE390906007 DESCRIPTIONFollowup encounter BASEENCOUNTERCOST12916 TOTALCLAIMCOST12916 PAYERCOVERAGE5416 REASONCODE558220040 REASONDESCRIPTIONHyperlipidemia}

确立匹配
当我们确认两位患者是同一人时,可以通过在他们之间建立匹配关系来链接他们。如果我们知道有一位名为Raye Wyman的患者,我们就可以找到名字相似的患者。在下一个查询中,我们对FIRST和LAST名字进行模糊匹配。
我们使用以下Lucene查询字符串:
plaintextflquerystring = Neptune#fts predicatesFIRSTvalueraye AND predicatesLASTvaluewyman
我们在以下Gremlin查询中使用该字符串。它查找与此条件匹配的患者,并返回匹配患者的名字、姓、邮政编码和出生日期属性。
gremlingwithSideEffect(Neptune#ftsendpoint {AOSENDPOINT})withSideEffect(Neptune#ftsqueryType querystring)withSideEffect(Neptune#ftssortOrder desc)V()hasLabel(Patient)has( {flquerystring})elementMap(FIRST LAST ZIP BIRTHDATE)
该查询找到两个匹配的患者,它们共用相同的LAST、ZIP和BIRTHDATE。
FIRST名字非常接近:Raye和Rxye。我们可能决定通过在它们之间添加一个匹配边来确认这两个患者是同一人。下个Gremlin查询使用addE(matches)添加一个标记为matches的边。from()和to()参数引用源节点和目标节点ID。我们设置边属性matchSource和matchAlg,表明该匹配是用户驱动,基于全文搜索:
gremlingaddE(matches)from(V(http//exampleorg/patientgraph/patient/3e7c92d13c0d485d8289154750bd5770))to(V(http//exampleorg/patientgraph/patient/x3e7c92d13c0d485d8289154750bd5770))property(matchSource user)property(matchAlg fts)
任何时候,我们都可以使用查询来查找我们的匹配。以下查询查找每个匹配的详细信息,限制为10个,包括匹配的患者:
gremlingV()outE(matches)inV()limit(10)path()by(elementMap())
在笔记本中,我们可以可视化结果。
我们通过使用匹配边链接相似实体的方式具有足够的通用性,可以将其应用于任何类型实体。我们将在下一部分中使用它来链接出版物。
清理
如果您设置了Neptune集群、笔记本实例或OpenSearch Service域以进行学习,请删除这些资源以避免额外费用。笔记本中有清理说明。
结论
知识图谱从多个来源收集实体。在本篇文章中,我们演示了如何使用词汇搜索在运行Neptune的知识图谱中查找相似实体。我们结合使用Neptune和OpenSearch Service,利用了一项称为全文搜索的功能。我们还展示了一种将相似实体链接在一起的常规方式。
在[第二部分](https
公告:Amazon QuickSight 社区开发者专区 商业智能博客
Amazon QuickSight 社区开发者角落正式上线作者:Kristin Mandia 和 Katie Connolly,发布日期:2023年10月31日在Amazon QuickSight上发...
安全地使用 AWS 会话管理器和 IAM 认证连接到 Amazon RDS for PostgreS
使用 AWS Session Manager 和 IAM 认证安全连接 Amazon RDS for PostgreSQL关键要点本篇文章介绍如何通过 AWS Session Manager 和 IA...