【问题标题】:Query to GraphDB's repository with custom functions SPARQL using Jena使用 Jena 使用自定义函数 SPARQL 查询 GraphDB 的存储库
【发布时间】:2020-12-13 07:56:33
【问题描述】:

我在 Property Function docs 之后使用 Jena ARQ 实现了一些自定义函数 SPARQL。这些函数使用模型处理本地数据集:

Model model = ModelFactory.createDefaultModel();

model.read(new FileInputStream("data/data.ttl"), null, "TTL");

Query query = QueryFactory.create(queryString) ; // the queryString contains a custom property function defined with Jena

try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
           ...
          }

但是,我需要将这些属性函数应用于对我的 Graphdb 存储库上的数据集的查询,因此我尝试使用 Jena 将程序连接到 GraphDB。

我已尝试关注Using GraphDB with Jena,但它似乎已过时且无法实施,因为 SailRepository.initialize();已弃用,并且 SesameDataset 不再存在来初始化我的模型。

import org.eclipse.rdf4j.repository.sail.SailRepository;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import com.ontotext.jena.SesameDataset;

...
RepositoryConnection connection = repository.getConnection();

// finally, create the DatasetGraph instance
SesameDataset dataset = new SesameDataset(connection);

我也尝试过 Jena 的 RDFConnection,但它不适用于我的自定义函数,因为没有模型后端来应用查询。

谁能告诉我在哪里可以找到要导入的 SesameDataset,或者是否有其他方法可以使用自定义函数查询 GraphDB 的存储库?

【问题讨论】:

  • 您在 Jena 中实现的自定义 SPARQL 函数确实无法在 GraphDB 上运行,因为 GraphDB 必须知道这些函数,因为查询字符串只是简单地发送到 GraphDB,它评估查询并返回结果集标准 SPARQL 响应格式。两个选项:a) 使用 RDF4J,这也意味着你必须重新实现你的东西并将 JAr 放在 GraphDB 类路径中或 b) 使用 Javascript 函数:graphdb.ontotext.com/documentation/free/…
  • 非常感谢您的帮助!我绝望地寻找耶拿的解决方案,不必重新实现我所有的自定义功能,但无论如何我似乎必须这样做。我会按照你的建议试试看。祝你有美好的一天!
  • 这与通信无关——这是标准的 SPARQL 协议。该问题提到了“属性函数”,它们保留在 SPARQL 语法中,但属于三重模式匹配的一部分,并提供设置变量和提供多个匹配项的能力。
  • @AndyS 我不确定你的评论是否理解,你能澄清一下吗?我正在寻找一种方法来使用我用 Jena 编写的属性函数在 GraphDB 上进行查询。
  • 过滤器的自定义函数和自定义属性函数是不同的东西。 Jeen 正在谈论过滤器功能。在这两种情况下,自定义代码都在查询引擎内执行,并且代码将是特定于引擎的。

标签: java dataset sparql jena graphdb


【解决方案1】:

Jeen(rdf4j 的创建者)指出了如何创建自定义函数。

但是,正如 AndyS(Jena 的创建者)指出的那样,您似乎需要神奇的谓词(自定义属性函数)。为此,我认为您需要创建一个插件并按照此处所述实现模式解释:http://graphdb.ontotext.com/documentation/standard/plug-in-api.html#pattern-interpretation

大部分插件都是在https://github.com/Ontotext-AD 开源的,所以你可以看到很多例子。我确定https://github.com/Ontotext-AD/graphdb-geosparql-plugin 使用了魔术谓词,例如

  • ?x geo:sfWithin ?y 是一个谓词,它检查(或返回)?x?y 内的所有特征
  • geof:sfWithin(?x,?y)(注意不同的命名空间)是一个检查相同条件的函数,但必须使用绑定参数调用:它找不到满足条件的特征。

查看this search,然后查看IRI GEO_SF_WITHIN,使用GEO_SF_WITHIN 搜索,您会找到com/ontotext/trree/geosparql/GeoSparqlFunction.java 和com/useeekm/geosparql/algebra/PropertyToFunctionOptimizer.java

【讨论】:

  • 非常感谢您的建议!我正在看插件。祝你有美好的一天!
【解决方案2】:

使用 RDF4J 而不是 Jena 与 GraphDB 进行通信,您的生活可能会变得更轻松 - 它是 GraphDB 开发人员的recommended Java API for this purpose

您可以按照this tutorial 在 RDF4J/GraphDB 中实现自定义 SPARQL 函数 - 总之,这是实现org.eclipse.rdf4j.query.algebra.evaluation.function.Function 接口并确保您的实现在 GraphDB 的类路径上并注册为 SPI 实现的问题。

【讨论】:

  • 非常感谢您的帮助!我绝望地寻找 Jena 的解决方案,不必重新实现我所有的自定义功能,但似乎无论如何我都必须这样做。我会按照你的建议试试看。祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多