2012-04-26 3 views
4

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

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

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

+0

Я мог бы предположить, что если причина, по которой вы пытаетесь извлечь эти значения, состоит в том, что вы хотите обеспечить их соблюдение, вы смотрите на использование аргументатора, чтобы сделать это для вас. – Michael

+0

Хорошо. Если это возможно, то как его реализовать. т.е. я прочитал целочисленное значение из документа, а затем мне нужно подтвердить, что значение соответствует ограничениям и поэтому может рассматриваться как «YEAR». Я новичок в OWL и Йене. – Vijith

+0

Вам действительно не нужно его реализовывать, вот в чем смысл. Просто убедитесь, что ваша онтология правильная, и рассудитель скажет, если вы что-то непоследовательно. Я предлагаю вам прочитать праймер OWL (http://www.w3.org/TR/owl-primer/), а затем проверить аргументацию. У Йены есть несколько встроенных функций, чтобы вы начали, но вы можете использовать другие варианты, такие как Pellet или Hermit. – Michael

ответ

4

Вы можете использовать различные подходы. Прежде всего, вы можете пройти Jena 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. 

Good example of such approach (благодаря Яну Dickinson)

Другой способ заключается в использовании 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 
} 
+1

«Но есть ограничение, из-за которого вы не можете получить ограничения, которые задаются пустыми узлами (как часто это делает Protege)». Это неправильно - Йена отлично справится с ограничениями bNode. –

+0

Я не нашел способа получить * Методы ограничения, работающие на bnodes. Было бы здорово, если бы вы могли представить такой пример. –

+1

Лев: см. Http://stackoverflow.com/questions/7779927/get-restrictions-on-classes-in-jena/7805455#7805455 –