java - SPARQL 选择查询在 JENA 中返回意外结果

标签 java sparql jena

我在我的研究项目中已经使用 Jena 一段时间了,但最近我一直在尝试使用 SPARQL 查询来帮助我的程序更有效地完成一些任务。

我使用 Twinkle ( http://www.ldodds.com/projects/twinkle/ ) 测试了一组查询并获得了所需的结果 - 但在耶拿实现它们时返回了额外的结果。

例如在 Twinkle 中

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();
}

其他信息: 斯帕克尔 v1.0 耶拿核心 2.7.4 耶拿 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 的查询?

最佳答案

区别在于,在 Jena 代码中,您使用 OntModel,而 Twinkle 仅使用普通的 Model

在 Jena 内部,对 Model 的 SPARQL 查询会转换为对 Model 的多次 find() 调用。使用 OntModel 时,这些 find() 调用将包含推断的三元组,因此会产生额外的结果。

使用 OntModel 获得的其他结果将取决于您在创建模型时选择的规则集。

关于java - SPARQL 选择查询在 JENA 中返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13195750/

相关文章:

java - 检查输入到数组中的输入是否正确/不正确

java - 在 Java 中使用 SPARQL 查找人员的位置

java - Jena 的 SPARQL 解析错误,但 DBpedia 接受查询

sparql - 耶拿/阿克 : Query Processing get stuck

java - 如何修复直接写入 HTTP header 输出的 Findbugs HTTP 参数

java - 在 Java 中等待条件

java - NoClassDefFoundError : com. squareup.picasso.Picasso 带电话

python - 值错误 : Invalid\escape while running query

java - NodeWritable java.lang.NoClassDefFoundError Hadoop耶拿

database - 在 Neo4J 数据库上使用 Jena 推理器