【发布时间】:2021-09-30 19:53:35
【问题描述】:
我正在使用 GraphDb 并且遇到数据更新问题: 存储库中的数据来自 2 个来源:
- 数以百万计的三元组来自外部来源,并且每周通过完全替换进行更新
- 数以千计的三元组由用户创建并且是永久性的。它们使用与外部源相同的本体并存储在相同的存储库中,因此 SPARQL 查询可以在两个数据上运行而没有任何区别。然而,一个简单的 SPARQL 查询可以检索所有用户的三倍。
问题在于外部源的每周更新。 我的第一个想法是
- 导出用户数据
- 导入并替换新的外部数据集
- 重新导入用户数据
问题:我需要重新导入导出的数据,导入是 RDF 格式,在导出中不可用。
另一种方式(大致相同):
- 将每周更新导入新存储库中
- 将用户数据从“旧”存储库复制到新存储库
- 将服务器切换到新的存储库。
问题:为了复制用户数据,我需要一个“INSERT SELECT”SPARQL 语句,该语句使用 SQL(无服务)中存在但 SPARQL 中不存在的服务
最后 GraphDB Ontorefine 应该可以完成这项工作,但不是每周都有效。 另一种方法是将用户数据存储在单独的存储库中,但涉及排序的 SPARQL 查询可能会变得难以维护且运行缓慢。
我还可以以 JSON 格式导出用户数据,并以编程方式生成 RDF/XLM 文件并将它们发送到 GraphDB API。这在技术上是可行的,我在非常特殊的情况下这样做,而且效果很好,但对于大量数据、速度慢和大型开发人员的工作来说并不可靠。
简而言之:我被卡住了!
【问题讨论】:
-
您能否澄清您所说的“为了复制用户数据,我需要一个“INSERT SELECT”SPARQL 语句,该语句使用存在于 SQL(无服务)但不存在于 SPARQL 中的服务”听起来像你想复制,但为什么要插入? SQL 中存在的服务是什么意思?
-
理想情况下,我可以运行一个 SPARQL 查询,例如“从服务 B 中插入服务 A SELECT”,这是一种副本,就像在 SQL 中一样,您可以在“表 A SELECT 中插入”表 B”。但这不存在。关于“SQL 中存在的服务”,我说的是 SQL 中存在的插入/选择,而不是服务语句。
-
现在我很好奇为什么下面这样的东西不起作用... INSERT { GRAPH localhost:7200/repositories/my_repo> {?s ?p ?o .}} WHERE{ ?s ?p ? o } GraphDB 是否只允许对活动存储库进行查询?从文档中很难分辨,但我确实看到“如果您使用 Workbench 作为 SPARQL 端点,您的所有查询都将发送到当前活动位置的存储库”。
-
实际上对 GraphDB 存储库的访问是使用 SERVICE
完成的。使用 GRAPH,您可以像在 SPARQL 1.1 中一样访问存储库中的图形。问题是 SELECT {?s ?p ?o} WHERE {SERVICE ... 有效,但从我的测试 INSERT {SERVICE ... 无效(“语法错误”)。但显而易见的解决方案是在命名图中从外部源导入数据,并在另一个图中创建用户数据。因此,当更新/替换时,我可以选择已删除/更新的图表。
标签: json backup rdf restore graphdb