3

当我启动一个 Fuseki 服务器时,我使用这个命令:

fuseki-server --config=config-orphadata.ttl

在这个 ttl 文件中,我可以写一些前缀规则:

@prefix orphanet: <http://www.orpha.net/ORDO/Orphanet_#> .
@prefix ORDO: <http://www.orpha.net/ORDO/> .

在 SPARQL 查询中,我必须编写所有前缀值,如下所示:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX oboInOwl: <http://www.geneontology.org/formats/oboInOwl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX Orphanet_: <http://www.orpha.net/ORDO/Orphanet_#>
PREFIX ORDO: <http://www.orpha.net/ORDO/>
select ?s ?p ?o ?m ?v ?e WHERE {
?s ?p ?o.
optional {?o ?m ?v. 
?v rdfs:label ?e}.
filter (?s = ORDO:Orphanet_2004)
}
ORDER BY ?o

如果我不写前缀,则查询不起作用...似乎配置文件中定义的规则前缀在查询中可能不可用。

在 SPARQL 查询中编写的所有元素都转到 GET 信息 URL。

是否可以通过在配置文件中添加前缀以在启动我的 fuseki 服务器后重用它来减少此查询的字符串长度?

4

1 回答 1

0

据我所知,不支持直接执行此操作。

破解通用解决方案

我还没有找到可以在解析查询时修改 ARQ 使用的前缀的位置,但这并不意味着它不存在。我的建议是,如果你想追求这个,那就是在 GrepCode 周围挖掘,直到你找到一个可以替换默认工厂/解析器的地方,然后将用于执行此操作的代码写入static一些自定义类的初始化程序中你的。这可能是史诗般的肮脏,因此您可能不值得这样做。

使用类路径中某处的新类 ( org.ididhax.ChangePrefixes) 启动 Fuseki,并将其放入[] ja:loadClass "org.ididhax.ChangePrefixes"您的 Fuseki 汇编程序文件中。这将导致 Fuseki 加载您的类,这将修改可用的前缀。

网络解决方法/黑客

如果您从 Web 界面使用 Fuseki,请更新 Fuseki 用于 Web 表单的模板,以便为您提交的任何查询附加一组默认前缀。那么 Fuseki 解析的 SPARQL 将是有效的。

Java 解决方法/Hack #1

这是我有时使用的解决方法。无论如何,我以编程方式构建了 99% 的查询。您所做的是构建一个PrefixMappingImpl并使用您喜欢的前缀加载它。编写一些代码来获取所需的 SPARQL 字符串,并以正确的格式在其前面加上这些前缀。那么,您的其余代码并不关心。

/* 'MyQueryFactory' hides the appending of your prefixes and the call to
 * the actual Jena 'QueryFactory'
 */
final String mySparqlString = "SELECT * WHERE { ?bob rdf:type vocab:Cat }";
final Query query = MyQueryFactory.create(mySparqlString);

Java 解决方法/技巧 #2

这通常是我个人的偏好。如果您的术语有Jena Schemagen Java 类词汇表,那么根本不要使用前缀。静态替换这些词汇表中的字段,并使用确切的术语构造 SPARQL。您将永远不会亲自看到单个 URI,如果您可能会更改词汇表,它会很方便(无论您使用不再存在的术语,都会给您带来方便的编译错误)。一个例子如下:

final Query query = QueryFactory.create(
  "SELECT * WHERE {\n"+
  " ?bob <"+RDF.type+"> <"+MyVocab.Cat+"> .\n"+
  "}");
于 2014-04-24T14:42:11.870 回答