我在我的研究项目中使用 Jena 已经有一段时间了,但是我最近一直在尝试使用 SPARQL 查询来帮助我的程序更有效地完成一些任务。
我使用 Twinkle ( http://www.ldodds.com/projects/twinkle/ )测试了一组查询并得到了想要的结果 - 但是在 Jena 中实现它们时返回了额外的结果。
例如在闪烁
SELECT ?x WHERE { ?x rdfs:domain ns:Area . ?x rdfs:range ns:Structure }
在闪烁时返回 1 个结果( ns:Contains ),而当在我的程序中使用 Jena 运行时,它会返回另一个属性( ns:testProperty ),因为范围和域不匹配。我无法弄清楚为什么会出现这种差异,任何指针都将不胜感激。
我的Java代码如下:
Query q = sparqlQueryGetProperties(s, o);
QueryExecution qexec = QueryExecutionFactory.create(q, m);
try {
Iterator<QuerySolution> rs = qexec.execSelect();
for (; rs.hasNext();) {
QuerySolution soln = rs.next();
if(soln.contains("x")){
RDFNode r = soln.get("x");
Resource rss = r.asResource();
props.add(rss.getLocalName());
}
}
} finally {
qexec.close();
}
其他信息:Sparql v1.0 Jena Core 2.7.4 Jena ARQ 2.9.4
用于测试的完整查询:
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX ns:<http://www.semanticweb.org/ontologies/2012/1/Ontology1328444427428.owl#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT ?x WHERE { ?x rdfs:domain ns:Area . ?x rdfs:range ns:Structure }
更新
不幸的是,我仍然从 TWINKLE 的测试用例中返回了额外的资源
这是在 Twinkle 和 Jena 上运行的确切 SPARQL 查询:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ns: <http://www.semanticweb.org/ontologies/2012/1/Ontology1328444427428.owl#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?prp ?x
WHERE
{ ns:cathedral ?prp ?x .
?x rdf:type owl:NamedIndividual .
FILTER ( ?prp != ns:hasShape )
}
闪烁的结果:
?prp = ns:within ?x = ns:Campus
耶拿的结果:
(?prp -> ?x)
sameAs -> cathedral
disjoin -> cathedral
differentFrom -> Cath_point_4 //This particular relationship seems completely random.
topObjectProperty -> cathedral
within -> Campus
这是我正在使用的数据(这是我开发的仅用于测试的本体):
http://cgi.csc.liv.ac.uk/~roscminni/ontResources/spatialOntCopy.owl
考虑到 Twinkle 似乎已过时,是否有更好的工具来测试 Twinkle 的查询?