Чтение значений ограничений с помощью Jena

У меня есть ограничение объекта, определенное следующим образом

hasYear some integer[minLength 2, maxLength 4, >=1995, <=2012]

Как я могу прочитать отдельные значения, определенные в ограничении, с помощью Jena.


person Vijith    schedule 26.04.2012    source источник
comment
Я мог бы предположить, что если причина, по которой вы пытаетесь извлечь эти значения, заключается в том, что вы хотите применить их, вы можете использовать ризонер, который сделает это за вас.   -  person Michael    schedule 27.04.2012
comment
Ok. Если это возможно, то как это реализовать. т.е. я прочитал целочисленное значение из документа, а затем мне нужно подтвердить, что значение соответствует ограничениям и, следовательно, может рассматриваться как «ГОД». Я новичок в OWL и Jena.   -  person Vijith    schedule 28.04.2012
comment
Вам действительно не нужно реализовывать это, в этом суть. Просто убедитесь, что ваша онтология верна, и ризонер сообщит вам, если что-то несовместимо. Я предлагаю вам прочитать учебник по OWL (w3.org/TR/owl-primer). ), затем проверьте причину. Jena поставляется с несколькими встроенными, чтобы вы могли начать работу, но вы можете использовать другие варианты, такие как Pellet или Hermit.   -  person Michael    schedule 29.04.2012


Ответы (1)


Вы можете использовать разные подходы. Прежде всего, вы можете пройти Йену Model с помощью следующего кода:

model.read(...);
StmtIterator si = model.listStatements(
        model.getResource("required property uri"), RDFS.range, (RDFNode) null);
while (si.hasNext()) {
    Statement stmt = si.next();
    Resource range = stmt.getObject().asResource();
    // get restrictions collection
    Resource nextNode = range.getPropertyResourceValue(OWL2.withRestrictions);
    for (;;) {
        Resource restr = nextNode.getPropertyResourceValue(RDF.first);
        if (restr == null)
            break;

        StmtIterator pi = restr.listProperties();
        while (pi.hasNext()) {
            Statement restrStmt = pi.next();
            Property restrType = restrStmt.getPredicate();
            Literal value = restrStmt.getObject().asLiteral();
            // print type and value for each restriction
            System.out.println(restrType + " = " + value);
        }
        // go to the next element of collection
        nextNode = nextNode.getPropertyResourceValue(RDF.rest);
    }
}

Если вы используете OntModel, представление кода графа RDF можно упростить, используя

model.listRestrictions()
ontClass.asRestriction()
etc.

Хороший пример такого подхода (спасибо Яну Дикинсону)

Другой способ — использовать запрос SPARQL 1.1 с тем же значением.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?datatype ?restr_type ?restr_value {
    ?prop rdfs:range ?range.
    ?range owl:onDatatype ?datatype;
        owl:withRestrictions ?restr_list.
    ?restr_list rdf:rest*/rdf:first ?restr.
    ?restr ?restr_type ?restr_value
}
person Lev Khomich    schedule 26.04.2012
comment
Но есть ограничение, что вы не можете получить ограничения, указанные пустыми узлами (как это часто делает Protege). Это неверно - Jena отлично справится с ограничениями bNode. - person Ian Dickinson; 27.04.2012
comment
Я не нашел способа заставить методы *Restriction работать с bnodes. Было бы здорово, если бы вы могли привести такой пример. - person Lev Khomich; 27.04.2012
comment
Лев: см. stackoverflow.com /вопросы/7779927/ - person Ian Dickinson; 27.04.2012
comment
Спасибо за разъяснение. Если вы не возражаете, я добавлю эту информацию в ответ. - person Lev Khomich; 27.04.2012
comment
Абсолютно не против — основная цель StackOverflow — совместно подбирать хорошие ответы на вопросы. Хорошая работа! - person Ian Dickinson; 28.04.2012