我可以使用 SPARQL* 查询来查询使用具体化的经典 RDF 模型吗?对我来说,耶拿文档在这里有点模糊。
下面的代码创建了一个具体化的语句:
<< <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();
}
}
}