如何使用-EDG-和-Neo4j-构建基于图的推荐引擎

如何使用 EDG 和 Neo4j 构建基于图的推荐引擎

原文:towardsdatascience.com/how-to-build-a-recommendation-engine-using-edg-and-neo4j/

引言

在本教程中,我将向您展示如何在 EDG 中管理分类法并将其发布到 Neo4j 实例中,在那里它可以填充额外的数据以驱动推荐引擎。在TopQuadrant 的 EDG 中构建和维护的分类法定义了结构。一组(虚构的)学术期刊文章作为实例数据,用于填充Neo4j。我将使用一个小型的 STEM 类别层次结构作为分类法来组织文章。这些数据Creative Commons CC0 1.0 Universal Public Domain Dedication的版权保护。

注意 1:完全披露——我在 TopQuadrant 工作,这是制作 EDG 的公司,因此我自然倾向于我熟悉的工具。Neo4j 和 TopQuadrant 的 EDG 都是商业产品,不是开源的。它们各自提供适合跟随本教程的免费试用版本:Neo4j 提供了一个免费的云数据库实例(数据量、内存和 CPU 有限制),而 TopQuadrant 提供 EDG Desktop 的 90 天免费试用。虽然这里概述的架构有其优点,但这不是唯一的方法,而且这些不是唯一能够支持此类工作流程的供应商。此方法的优缺点如下。

注意 2:这里是关于这个演示的视频记录。

注意 3:本帖中的所有图片均由作者创建。

所有这些的目的是什么?目的是,大量的意义都存在于分类法本身。每篇文章都被标记为最具体的适用类别,但由于分类法编码了父子关系,我们可以自动推断出更高层次的关联。例如,如果一篇文章被标记为数学软件,那么它也涉及计算机科学STEM,即使它没有明确地这样标记。分类法不仅进行分类,还使人们能够推理主题之间的关系,因此数据源只需要记录最相关的标签,而层次结构会填充其余部分。

我们正在将关于单个文章主题的实例级信息与关于主题本身及其相互关系的元信息分开。

您想要使用这种架构的原因是:

  1. 推理: 使用一个概念进行标记,但使用分类法将许多其他概念与内容关联起来。与其将文章标记为 Mathematical SoftwareComputer Science,我只需将其标记为 Mathematical Software。分类法知道 Mathematical SoftwareComputer Science 的一个分支。基于分类法,可以推断出父概念 Computer Science

  2. 对齐多个系统: 我可以使用一个分类法在 Neo4j 中构建推荐引擎,在 GraphDB 中构建 GraphRAG 应用。一个团队可以在 SharePoint 中存储的内容上使用基于向量的标记,而另一个团队则使用基于 NLP 规则的标记在 Adobe Experience Manager (AEM) 中存储的内容上。所有这些应用都是对齐的,因为它们都在使用相同的参考数据。

  3. 变更管理: 如果我想将 Mathematical Software 重新分类为 Mathematics 的一个分支而不是 Computer Science 的一个分支,我只需更改它在分类法中的父类。如果没有单独的分类法,我需要重新标记所有标记为 Mathematical Software 的文档。如果有多个下游应用使用相同的术语列表,这将成为一场噩梦。我需要在每个应用中重新标记所有标记为 Mathematical Software 的实体,并确保与该文档相关联的所有其他标签都是正确的。

  4. 发挥工具的优势: EDG 在管理元数据和分类法以及确保这些事物对齐和良好治理方面表现优秀。Neo4j 和其他图数据库在可扩展的高性能图分析方面表现卓越,但在元数据管理方面存在挑战。在这种配置下,我们可以兼得两者之长。

当然,还有其他构建类似架构的方法,而且我概述的方法也存在一些缺点。其中主要的一些包括:

  1. 对于简单用例过度: 这个教程使用了一个简单的演示,但当你数据和用例复杂时,这种架构才最有意义。大多数图数据库,包括 Neo4j,都允许你定义模式或基本本体,并用层次关系表示分类法。如果你的数据相对简单,你的分类法很简单,或者只有一个团队需要使用它,你可能不需要这么多工具。

  2. 技能集和学习曲线: 使用 EDG 和 Neo4j 一起假设对两种不同的范式熟悉:在 RDF/SHACL 中的本体建模和在属性图/Cypher 中的图查询。许多团队对其中一种范式感到舒适,但对另一种则不然。

  3. 更多移动部件: 将分类法与您标记的数据分开意味着您需要确保标签与分类法对齐。如果它们发生偏移,图在数据库中就无法干净地组合在一起。

  4. 供应商锁定:Neo4j 和 EDG 都是商业产品,因此总会有一些锁定和潜在的迁移成本。EDG 的底层标准(RDF、SHACL 和 SPARQL)是来自 W3C 的开源标准,这有助于减轻整体技术锁定。

Neo4j 是一个带标签的属性图(LPG)。EDG 是一个基于 RDFSHACL 的知识图谱编辑工具。LPG 和 RDF 是两种不同的图技术,在历史上它们并不兼容。然而,EDG 最近构建了一个 Neo4j 集成功能,允许用户使用这两种技术来构建。

下面是这两种技术如何协同工作的可视化表示。

图片

在底部以粉色显示的是数据存储。我将这些分为内部数据和外部数据。内部数据是您可以存储在数据湖、内容管理系统(CMS)如 SharePoint 或关系型数据库中的原始数据。还可能有您想要集成到应用程序中的外部数据集。这些可能是公共、免费的数据源,如 WikiData,高级本体如 gist,或专有参考数据集,如 SNOMEDMedDRA(医疗分类)。

EDG 可以作为底层数据和下游应用之间的语义层。您可以在一个地方管理您的本体、分类法、参考数据和元数据,并在需要时将所需内容推送到像 Neo4j 这样的应用程序。您还可以直接从底层数据源将数据加载到 Neo4j 或任何其他应用程序中。

第 1 步:获取 EDG 和 Neo4j 的免费版本

首先,我们需要获取这些产品的免费版本来尝试。

对于 EDG,您需要访问 这个 网站,并请求免费试用。您将通过电子邮件获得下载 EDG 和许可证的链接。下载完成后,edg 文件夹中有一个可执行文件,也称为 edg。双击它,它应该在您的浏览器中启动。如果您没有安装 Java,它将提示您首先安装 Java。

图片

然后 EDG 将在新标签页中打开,标签页名称可能类似于 localhost:8083/。但它会显示它尚未注册。点击“产品注册”,然后上传随电子邮件一起发送的许可证文件。然后点击“注册产品”。

图片

上传许可证后,您可以通过点击左上角的 TopQuadrant 标志返回主页。现在您应该能够看到主要的 EDG 登录页面。

图片

现在我们需要一个 Neo4j 的免费版本。访问这个链接开始你的免费试用。如果你还没有账户,你需要创建一个。创建 Neo4j 账户后,你会看到一个类似这样的屏幕:

图片

点击“创建实例”然后选择免费选项。

图片

当你点击“创建实例”时,你会看到你的用户名和密码。用户名通常是“Neo4j”,但密码是唯一的,所以请记下来。

第 2 步:设置集成

在 EDG 中,在右上角点击用户图标(它看起来像一个人)。然后点击“服务器管理”。这将带你去一个有很多选项的屏幕。点击“产品配置参数”。在左侧工具栏中,你会看到很多集成选项。点击“Neo4j”。

图片

你可以配置它将数据推送到多个 Neo4j 数据库,但在这个教程中,我们将只指向我们刚刚创建的 Neo4j 实例。在空白的 Neo4j 数据库行右侧有一个加号。点击它,你将被提示输入 Neo4j 凭据。

图片

你可以给这个配置起任何名字,但我选择了“neo4jtest1”。ID 应该会由 EDG 自动填写。对于 Neo4j 数据库 URL,你需要检查你在 Neo4j 中创建的 Neo4j 实例。它看起来可能像这样:neo4j+s://cd227570.databases.neo4j.io。

点击“创建并选择”。现在你需要输入你的密码。这是 Neo4j 在你创建 Neo4j 实例时给你的那个。

图片

现在我们都已经配置好了。

第 3 步:导入分类法

前往我的 GitHub 并下载这个分类法。这是一个 STEM 主题的分层列表,即分类法。

在 EDG 屏幕顶部点击“新建+”然后选择“从 TriG 或 Zip 文件导入资产集合”。选择你从我的 GitHub 获得的 zip 文件并将其加载到 EDG 中。点击完成。当你转到分类法时,你应该会看到一个包含许多不同 STEM 类别的分层列表。

图片

第 4 步:将分类法推送到 Neo4j

点击云下拉菜单来管理集成。在下拉菜单中,你会看到一个“链接到 Neo4j 数据库”的选项。

图片

当你点击这个选项时,你将能够选择你想要使用的 Neo4j 集成。点击你在第 2 步中创建的那个。

图片

在您选择 Neo4j 集成后,此分类法与您的 Neo4j 实例之间的集成将被创建。它看起来像下面的弹出窗口。点击集成以导航到它。在我的示例中,它被称为“与 Neo4j 数据库 neo4jtest1 的集成”。然后点击“确定”。

图片

现在集成将出现在编辑器中,如果我们想的话,我们可以更改任何设置。你会注意到云下拉菜单旁边有一个看起来像带有箭头的云的图标,用于将内容推送到集成系统。

图片

点击编辑,然后滚动到“包含的类”。这是我们指定我们想要推送到此 Neo4j 实例中的分类法中的哪些类的位置。对于这个教程,选择“概念”。这应该包括分类法中的所有内容。这看起来可能是不必要的,但对于具有许多不同类的大型分类法来说,这是很重要的。

图片

还选择“总是覆盖”为“True”。这确保了当我们推送时,我们将覆盖 Neo4j 实例中的任何内容。

图片

现在点击“保存更改”。

在编辑器界面中,点击现在我们已经建立了 Neo4j 集成后的顶部工具栏中的云推送图标。应该会出现一个看起来像下面图片的弹出窗口。如果我们配置了多个与多个不同应用程序集成的集成,我们会在这里看到它们。对于这个教程,你应该只看到你创建的那个,并且它应该自动被选中。现在点击“确定”。

图片

你应该会看到一个进度条,显示你的概念正在被推送到 Neo4j。

图片

第 5 步:在 Neo4j 中探索数据

现在回到你的 Neo4j Aura 实例。如果你点击左侧工具栏上的“实例”,你会看到我们在第 1 步中创建的实例。现在你会看到其中包含节点和关系!

图片

你可以点击“连接”,然后点击“探索”,这将带你到你的图的视觉表示。

图片

下面是 Neo4j Aura 的视觉探索器。你只需在通用术语“资源 – 广义 – 资源”上搜索,就可以看到我们从 EDG 推送的所有概念及其父概念。

图片

第 6 步:将文章上传到 Neo4j

从我的 GitHub这里下载一份期刊文章列表。这是一份假的学术期刊文章的简短列表。这里的想法是我们希望分类法来自 EDG,而文章元数据来自其他地方。

现在,在 Neo4j 中,点击左侧工具栏中的“导入”和“新数据源”。将出现一个选项列表。你可以从任何地方导入你的实例数据,但在这个教程中,我们只是直接上传 csv 文件。数据源不重要,重要的是实例数据被标记了来自我们在 EDG 中管理的分类法中的术语。这就是我们如何将文章元数据与我们的分类法和更广泛的语义层对齐。

图片

上传从我的 GitHub 下载的 csv 文件。然后你会被询问如何定义你的模型。选择“从模式生成”。

图片

你会看到 Articles.csv 作为节点出现。点击该节点。你需要指定想要用作主键的属性。在这个文章列表中有一个名为“id”的属性,我们将使用它作为主键。要将此设置为键,点击“id”行右下角的键图标。然后选择“运行导入”。

图片

你将被提示输入此实例的密码,这是你最初记下的那个。运行需要一秒钟,然后你会得到一个导入结果的弹出窗口。

图片

你可以看到创建了 15 个节点。csv 文件包含了 15 篇文章,每篇文章都变成了一个节点。现在我们可以回到“探索”功能并搜索“Articles.csv”。你会看到文章以粉红色出现在视觉中,与绿色 STEM 类别并列。这很好,但它们还没有连接。要将实例数据(文章)与类别连接,我们需要运行一个 cypher 查询。

图片

第 7 步:将实例数据与分类关联

在左侧工具栏中点击“查询”。在查询框中输入:

// 1) Match every imported article node that has a topicUri
MATCH (a:`Articles.csv`)
WHERE a.topicUri IS NOT NULL

// 2) Find the corresponding Concept by its uri property
MATCH (c:Concept {uri: a.topicUri})

// 3) Create the TAGGED_WITH relationship (idempotent)
MERGE (a)-[:TAGGED_WITH]->(c)

// 4) Return a sanity check
RETURN count(*) AS totalTaggedRelationships;

它应该看起来像这样:

图片

然后按“运行”。你会在查询下方看到“创建了 15 个关系”。这是一个好兆头。现在回到“资源管理器”。现在搜索“Articles.csv – TAGGED_WITH – Resource”。你会看到所有那些粉红色的节点现在都连接到了我们的绿色分类法!

图片

第 8 步:构建推荐引擎

我们将运行一些非常基础的相似度查询来展示如何使用我们刚刚构建的图进行推荐。首先,让我们看看一篇文章及其被标记的类别。将以下 cypher 查询输入到查询界面。这将列出文章“Advances in Mathematical Software Studies #7”被标记的类别。

MATCH (a:`Articles.csv` {title: 'Advances in Mathematical Software Studies #7'})
MATCH (a)-[:TAGGED_WITH]->(c:Concept)
RETURN a.title AS article, c.prefLabel AS tag, c.uri AS uri
ORDER BY tag;

你应该看到以下输出和类别“Mathematical Software”。

图片

假设我们想要找到与这篇引人入胜的文章相似的文章,因为我们想向潜在的读者推荐它们。我们可以寻找也被标记为数学软件的其他文章,但我们可以利用我们在图中已有的分类结构。根据 STEM 分类法,数学软件计算机科学的一个子类。你可以回到 EDG 去探索类别及其子类别。对于我们的推荐引擎,为了找到与我们的数学软件文章相似的文章,我们想要找到被标记为数学软件的其他文章,但也想要找到被标记为计算机科学其他分支的文章。

我们可以用以下 Cypher 查询来实现:

// 0) Seed article by its real label
MATCH (me:`Articles.csv` {title: 'Advances in Mathematical Software Studies #7'})  

// 1) get each tagged topic plus its parent
MATCH (me)-[:TAGGED_WITH]->(child:Concept)-[:BROADER]->(parent:Concept)  

// 2) find any other article tagged with a sibling under that same parent
MATCH (siblingChild:Concept)-[:BROADER]->(parent)<-[:BROADER]-(child)
MATCH (rec:`Articles.csv`)-[:TAGGED_WITH]->(siblingChild)  
WHERE rec <> me  

// 3) compute recommendation score
WITH rec, count(DISTINCT parent) AS score  

// 4) now pull in all the direct tags on each recommended article
OPTIONAL MATCH (rec)-[:TAGGED_WITH]->(t:Concept)  

// 5) return title, score, and full tag list
RETURN 
  rec.title                        AS recommendation,
  score                            AS sharedParentCount,
  collect(DISTINCT t.prefLabel)    AS allTaggedTopics
ORDER BY score DESC, recommendation
LIMIT 5;

你应该得到以下结果:

图片

没有其他文章被标记为数学软件,但有文章被标记为计算机科学的其他分支。“计算机与社会研究进展”是一篇被标记为“计算机与社会”类别的文章。这是推荐的,因为图知道计算机与社会数学软件都是计算机科学的分支。

第 9 步:调整我们的分类法

我之前提到,你想要将你的分类法与你的图数据库分开的一个原因是你可以在你的分类法中做出更改,并轻松地在你的应用程序中看到下游的影响。让我们试试。

假设我们想要将数学软件重新归类为数学的一个分支,而不是计算机科学的一个分支。要在我们的分类法中这样做,我们只需在 EDG 的树结构中将术语拖放即可。

图片

现在通过相同的云按钮将分类法推回 Neo4j。

图片

现在我们回到 Neo4j 再次运行推荐算法,结果完全不同。这是因为我们的原始文章被标记为数学软件,我们现在将其归类为数学的一个分支。推荐给我们的其他文章都是关于数学的文章,而不是计算机科学。

图片

结论

这个简单的演示展示了分类法如何为你的数据应用带来结构、灵活性和智能。通过将你的分类法(在 EDG 中)与你的实例元数据(在 Neo4j 中)分开,你获得了推断关系、对齐系统和随着时间的推移发展你的模型的能力,而无需重新标记或重建下游应用程序。结果是模块化架构,随着你对领域理解的加深,你的图变得更智能。

关于作者:Steve Hedden 是TopQuadrant的产品管理负责人,在那里他领导着知识图谱和元数据管理平台 EDG 的战略。他的工作专注于通过本体、分类法和语义技术将企业数据治理与人工智能连接起来。Steve 经常撰写和发表关于知识图谱以及语义在人工智能系统演变中的角色的文章和演讲。

posted @ 2026-03-28 09:32  绝不原创的飞龙  阅读(0)  评论(0)    收藏  举报