Вывод RDFS в Йене с использованием ARQ (SPARQL)

Документы Йены здесь 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 и не проходит subClassOftree. Я считаю, что пропустил базовую настройку или использование схемы 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);
    }

}

person Buzz Moschetti    schedule 29.09.2017    source источник
comment
Этот код никогда не может работать: вы не можете добавлять операторы и просто использовать префиксы URI - как API должен знать, в какой полный URI разрешить? Например, вы добавляете "x:A", "rdf:type", "rdfs:Class" - ›rdf: type никогда не будет преобразован в правильный URI http://www.w3.org/1999/02/22-rdf-syntax-ns#type. То же самое и со всеми остальными. Все те, для которых не указан протокол, будут преобразованы в локальный URI.   -  person UninformedUser    schedule 29.09.2017
comment
То же самое и с запросом SPARQL: PREFIX rdfs: <rdfs:> не имеет ничего общего с пространством имен RDFS, необходим полный URI   -  person UninformedUser    schedule 29.09.2017
comment
@AKSW Ага; Я просто экспериментировал с переключением на RDF.type и RDFS.subClassOf и т. Д. Я могу понять, почему мне нужны полные URI для механизма рассуждений, чтобы делать это (поскольку он их ищет), но не должны мои собственные классы обойтись простым префиксом x :?   -  person Buzz Moschetti    schedule 29.09.2017
comment
Да, должно. Я добавил код, который работает у меня ниже. Вы можете проверить, это то, что вам нужно, или чего-то еще не хватает   -  person UninformedUser    schedule 29.09.2017


Ответы (1)


(Это неполный ответ!)

Согласно приведенному выше комментарию, некоторый рабочий код:

import org.apache.jena.ontology.OntModel;
import org.apache.jena.query.*;
import org.apache.jena.rdf.model.*;
import org.apache.jena.vocabulary.RDF;
import org.apache.jena.vocabulary.RDFS;

public class jena2 {

    private static void addRaw(OntModel m, Resource s, Property p, Resource o) {
        m.add(ResourceFactory.createStatement(s, p, o));
    }

    public static void main(String[] args) {
        OntModel model = ModelFactory.createOntologyModel();

        Resource A = ResourceFactory.createResource("x:A");
        Resource B = ResourceFactory.createResource("x:B");
        Property prop1 = ResourceFactory.createProperty("x:prop1");
        Property prop2 = ResourceFactory.createProperty("x:prop2");
        Resource whatever = ResourceFactory.createResource("x:whatever");
        Resource other = ResourceFactory.createResource("x:other");
        Resource widget = ResourceFactory.createResource("x:widget");

        addRaw(model, A, RDF.type, RDFS.Class);
        addRaw(model, A, prop1, whatever);
        addRaw(model, B, RDF.type, RDFS.Class);
        addRaw(model, B, prop2, other);
        addRaw(model, B, RDFS.subClassOf, A);
        addRaw(model, widget, RDF.type, B);

        StringBuffer sb = new StringBuffer();

        sb.append("PREFIX x: <x:>");
        sb.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>");
        sb.append("SELECT * {");
        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);
        }

    }
}

Вывод:

( ?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]
( ?all = <x:B> ) ( ?props = rdfs:subClassOf ) -> ( ?type = <x:B> ) -> [Root]
( ?all = rdfs:Resource ) ( ?props = rdfs:subClassOf ) -> ( ?type = <x:B> ) -> [Root]
( ?all = rdfs:Resource ) ( ?props = rdf:type ) -> ( ?type = <x:B> ) -> [Root]
( ?all = rdfs:Class ) ( ?props = rdf:type ) -> ( ?type = rdfs:Resource ) -> [Root]
( ?all = rdfs:Resource ) ( ?props = rdfs:subClassOf ) -> ( ?type = rdfs:Resource ) -> [Root]
( ?all = rdfs:Resource ) ( ?props = rdf:type ) -> ( ?type = rdfs:Resource ) -> [Root]
( ?all = rdfs:Resource ) ( ?props = rdfs:subClassOf ) -> ( ?type = <x:A> ) -> [Root]
( ?all = <x:whatever> ) ( ?props = <x:prop1> ) -> ( ?type = <x:A> ) -> [Root]
( ?all = rdfs:Class ) ( ?props = rdf:type ) -> ( ?type = <x:A> ) -> [Root]
( ?all = <x:A> ) ( ?props = rdfs:subClassOf ) -> ( ?type = <x:A> ) -> [Root]
( ?all = rdfs:Resource ) ( ?props = rdf:type ) -> ( ?type = <x:A> ) -> [Root]

Он также возвращает свойства класса RDFS A

person UninformedUser    schedule 29.09.2017
comment
Подтверждаю, что ваши рекомендации работают. Большое спасибо и позор мне за попытку обмануть с нежелательными URI. Кстати, я думаю, что статическая строка x не используется. - person Buzz Moschetti; 29.09.2017