【发布时间】:2021-04-19 07:48:37
【问题描述】:
我可以使用 SPARQL* 查询来查询使用具体化的经典 RDF 模型吗? 对我来说,Jena documentation 在这里有点模糊。
下面的代码创建了一个具体化的语句:
<< <http://www.mysubject.com> <http://www.mypredicate.com> <http://www.myobject.com> >> <http://www.sayed.de#sayed> <http://www.sayer.de> .
该代码还包含两个查询:(i) 一个经典的 SPARQL 查询,(ii) 一个 SPARQL* 查询。
两者都查询 <http://www.sayer.de> 作为结果。虽然 (i) 提出了解决方案,但 (ii) 没有这样做。
我在做什么/理解错了?
import org.apache.jena.ontology.DatatypeProperty;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.ontology.OntModelSpec;
import org.apache.jena.query.*;
import org.apache.jena.rdf.model.*;
import java.io.StringWriter;
public class RdfStar {
public static void main(String[] args) {
// let's create an ontModel and fill it with data:
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
ReifiedStatement s = model.createReifiedStatement(
model.createStatement(
ResourceFactory.createResource("http://www.mysubject.com"),
ResourceFactory.createProperty("http://www.mypredicate.com"),
ResourceFactory.createResource("http://www.myobject.com"))
);
ObjectProperty sayedProperty = model.createObjectProperty("http://www.sayed.de#sayed");
s.addProperty(sayedProperty, model.createResource("http://www.sayer.de"));
// write to console
StringWriter myWriter = new StringWriter();
model.write(myWriter, "NT");
String result = myWriter.toString();
System.out.println(result);
// now let's create a regular query
String queryString = "SELECT ?who WHERE {" +
"?statement <http://www.sayed.de#sayed> ?who ." +
"}";
Query query = QueryFactory.create(queryString) ;
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
ResultSet results = qexec.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
RDFNode x = soln.get("who");
System.out.println(x);
}
} catch (Exception e){
e.printStackTrace();
}
// NOW SPARQL STAR
queryString = "SELECT ?who WHERE {" +
"<< ?a ?b ?c >> ?d ?who ." +
"}";
query = QueryFactory.create(queryString, Syntax.syntaxARQ) ;
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
ResultSet results = qexec.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
RDFNode x = soln.get("who");
System.out.println("Star result: " + x);
}
} catch (Exception e){
e.printStackTrace();
}
}
}
【问题讨论】:
-
首先:让我们明确一下术语
<<:s :p :o>> :q :z .不是具体的陈述。 RDF Reification 使用属性rdf;subject、rdf;predicate、rdf:object:参见w3.org/wiki/RdfReification。有可能向物化转变。 -
是的,对于不准确之处深表歉意!我只是用这个符号很短。如果您执行 Java 文件,您可以看到实际的三元组。
标签: sparql jena reification rdf-star