使用fuseki减少查询sparql的字符串长度

时间:2014-04-09 14:32:15

标签: sparql fuseki turtle-rdf n3

当我启动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服务器后将配置文件中的前缀放入以重复使用来减少此查询的字符串长度?

1 个答案:

答案 0 :(得分: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解决方法/ Hack#2

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

final Query query = QueryFactory.create(
  "SELECT * WHERE {\n"+
  " ?bob <"+RDF.type+"> <"+MyVocab.Cat+"> .\n"+
  "}");