Java 查询GraphDB';s存储库,带有使用Jena的SPARQL自定义函数

Java 查询GraphDB';s存储库,带有使用Jena的SPARQL自定义函数,java,dataset,sparql,jena,graphdb,Java,Dataset,Sparql,Jena,Graphdb,我已经用Jena ARQ实现了一些自定义函数SPARQL,如下所示。这些函数使用模型处理本地数据集: Model model = ModelFactory.createDefaultModel(); model.read(new FileInputStream("data/data.ttl"), null, "TTL"); Query query = QueryFactory.create(queryString) ; // the queryStri

我已经用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

我尝试了以下操作,但它似乎过时了,无法实现,因为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的存储库?

如果使用RDF4J与GraphDB通信,而不是Jena,可能会使您的生活变得更轻松-这是GraphDB开发人员最喜欢的方法

您可以通过以下方式在RDF4J/GraphDB中实现自定义SPARQL函数:总之,实现
org.eclipse.RDF4J.query.algebra.evaluation.function.function
接口,并确保您的实现位于GraphDB的类路径上并注册为SPI实现。

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

然而,正如AndyS(Jena的创建者)所指出的,您似乎需要神奇的谓词(自定义属性函数)。为此,我认为您需要创建一个插件并实现如下所述的模式解释:

大多数插件都是开源的,所以你可以看到很多例子。我确信它使用了神奇的谓词,例如

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

看,然后看,搜索,您会发现com/ontotext/trree/geosparql/GeoSparqlFunction.java和com/useekm/geosparql/algebra/PropertyToFunctionOptimizer.java

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