Документы Йены здесь https://jena.apache.org/documentation/javadoc/jena/index.html заявляют, что createOntologyModel
включает слабый аргумент для транзитивного закрытия иерархий подклассов и подсвойств, и это все, что я ищу. Начиная с простой модели:
x:A rdf:type rdfs:Class .
x:A x:prop1 x:whatever .
x:B rdf:type rdfs:Class .
x:B rdfs:subClassOf x:A .
x:B x:prop2 x:other .
x:myInstance rdf:type x:B .
Я пытаюсь запросить rdf:type x:B
и получить все свойства для B
и суперкласса A
, например
( ?all = <x:whatever> ) ( ?props = <x:prop1> ) -> ( ?type = <x:A> ) -> [Root]
( ?all = <x:A> ) ( ?props = <rdfs:subClassOf> ) -> ( ?type = <x:B> ) -> [Root]
( ?all = <x:other> ) ( ?props = <x:prop2> ) -> ( ?type = <x:B> ) -> [Root]
( ?all = <rdfs:Class> ) ( ?props = <rdf:type> ) -> ( ?type = <x:B> ) -> [Root]
Я немного поэкспериментировал с этим примером. Он компилируется и запускается, но дает только свойства для B и не проходит subClassOf
tree. Я считаю, что пропустил базовую настройку или использование схемы RDF, которая позволяет рассуждающему делать свое дело. Какие-нибудь подсказки?
public class jena2 {
private static void addRaw(OntModel m, String s, String p, String o) {
m.add(ResourceFactory.createStatement(
new ResourceImpl(s),new PropertyImpl(p),new ResourceImpl(o))
);
}
public static void main(String[] args) {
OntModel model = ModelFactory.createOntologyModel();
addRaw(model, "x:A", "rdf:type", "rdfs:Class");
addRaw(model, "x:A", "x:prop1", "x:whatever");
addRaw(model, "x:B", "rdf:type", "rdfs:Class");
addRaw(model, "x:B", "x:prop2", "x:other");
addRaw(model, "x:B", "rdfs:subClassOf", "x:A");
addRaw(model, "x:widget", "rdf:type", "x:B");
StringBuffer sb = new StringBuffer();
sb.append("PREFIX x: <x:>");
sb.append("PREFIX rdf: <rdf:>");
sb.append("PREFIX rdfs: <rdfs:>");
sb.append("SELECT *");
sb.append("WHERE {");
sb.append(" x:widget rdf:type ?type .");
sb.append(" ?type ?props ?all .");
sb.append("}");
Query query = QueryFactory.create(sb.toString());
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
ResultSet results = qexec.execSelect() ;
for ( ; results.hasNext() ; ) {
QuerySolution soln = results.nextSolution() ;
System.out.println(soln);
}
} catch(Exception e) {
System.out.println("epic fail: " + e);
}
}
"x:A", "rdf:type", "rdfs:Class"
- ›rdf: type никогда не будет преобразован в правильный URIhttp://www.w3.org/1999/02/22-rdf-syntax-ns#type
. То же самое и со всеми остальными. Все те, для которых не указан протокол, будут преобразованы в локальный URI. - person UninformedUser   schedule 29.09.2017PREFIX rdfs: <rdfs:>
не имеет ничего общего с пространством имен RDFS, необходим полный URI - person UninformedUser   schedule 29.09.2017