2013-04-28 2 views
0

Я пытаюсь отобразить значения свойств данных экземпляров моей онтологии. Для этого я использую Йену. Мои экземпляры следующим образом:Извлечение значения свойства данных из экземпляра онтологии

<!-- http://www.semanticweb.org/ontologies/2013/3/Ontology1365003423152.owl#Mailbomb --> 

<NamedIndividual rdf:about="&Ontology1365003423152;Mailbomb"> 
    <rdf:type rdf:resource="&Ontology1365003423152;Attack"/> 
    <Ontology1365003423152:HasService>smtp</Ontology1365003423152:HasService> 
    <Ontology1365003423152:HasFlag>SF</Ontology1365003423152:HasFlag> 
    <Ontology1365003423152:HasDuration>1</Ontology1365003423152:HasDuration> 
    <Ontology1365003423152:hasSrcBytes>2599</Ontology1365003423152:hasSrcBytes> 
    <Ontology1365003423152:HasType>Mailbomb</Ontology1365003423152:HasType> 
    <Ontology1365003423152:HasProtocol>tcp</Ontology1365003423152:HasProtocol> 
    <Ontology1365003423152:hasDestBytes>293</Ontology1365003423152:hasDestBytes> 
</NamedIndividual> 

<!-- http://www.semanticweb.org/ontologies/2013/3/Ontology1365003423152.owl#Smurf --> 

<NamedIndividual rdf:about="&Ontology1365003423152;Smurf"> 
    <rdf:type rdf:resource="&Ontology1365003423152;Attack"/> 
    <Ontology1365003423152:HasService>ecr_i</Ontology1365003423152:HasService> 
    <Ontology1365003423152:HasProtocol>icmp</Ontology1365003423152:HasProtocol> 
    <Ontology1365003423152:hasSrcBytes>1032</Ontology1365003423152:hasSrcBytes> 
    <Ontology1365003423152:HasFlag>SF</Ontology1365003423152:HasFlag> 
    <Ontology1365003423152:HasType>Smurf</Ontology1365003423152:HasType> 
    <Ontology1365003423152:hasDestBytes>0</Ontology1365003423152:hasDestBytes> 
    <Ontology1365003423152:HasDuration>0</Ontology1365003423152:HasDuration> 
</NamedIndividual> 

И мой код в Java с помощью Jena выглядит следующим образом:

public static void main(String[] args) { 
      String a[] = new String [7]; 
      OntProperty p[] = new OntProperty [7]; 
    OntModel inf = ModelFactory.createOntologyModel(); 
    InputStream in = FileManager.get().open(inputFileName); 
    if (in == null) { 
     throw new IllegalArgumentException("File: " + inputFileName + " not found"); 
    } 
    inf.read(in, ""); 
    OntClass clas =inf.getOntClass("http://www.semanticweb.org/ontologies/2013/3/Ontology1365003423152.owl#Attack"); 
    p[0] = inf.getOntProperty("HasProtocol"); 
    p[1] = inf.getOntProperty("HasService"); 
    p[2] = inf.getOntProperty("HasDuration"); 
    p[3] = inf.getOntProperty("HasFlag"); 
    p[4] = inf.getOntProperty("hasSrcBytes"); 
    p[5] = inf.getOntProperty("hasDestBytes"); 
    p[6] = inf.getOntProperty("HasType"); 
    ExtendedIterator instances = clas.listInstances(); 
    Individual instance = null; 
    while (instances.hasNext()) { 
     instance = (Individual) instances.next(); 
     System.out.println(a[0] = instance.getPropertyValue(p[0]).toString()); 
     System.out.println(a[1] = instance.getPropertyValue(p[1]).toString()); 
     System.out.println(a[2] = instance.getPropertyValue(p[2]).toString()); 
     System.out.println(a[3] = instance.getPropertyValue(p[3]).toString()); 
     System.out.println(a[4] = instance.getPropertyValue(p[4]).toString()); 
     System.out.println(a[5] = instance.getPropertyValue(p[5]).toString()); 
     System.out.println(a[6] = instance.getPropertyValue(p[6]).toString()); 
    } 
} 

Теперь первая итерация печати печатает только нулевой, тогда как второй только 293 (7 раз 0 с последующим в 7 раз 293). Я думаю, что я делаю что-то неправильно, потому что он получает одинаковое значение для всего. Как я вижу, это только печать последних значений свойств данных для каждого экземпляра.

ответ

2

Так же, как вам нужно указать все IRI в

inf.getOntClass("http://www.semanticweb.org/ontologies/2013/3/Ontology1365003423152.owl#Attack"); 

вам нужно указать весь IRI в

p[0] = inf.getOntProperty("HasProtocol"); 

Так что, вероятно, не OntProperty с IRI HasProtocol, p[0] (и остальные) устанавливаются на null, а во многих местах API Jena интерпретирует null как шаблон. Так

instance.getPropertyValue(p[0]).toString()); 

просто запрашивая модель тройной с instance как субъекта и любого предиката и любого объекта. Кажется, что Йена просто возвращает одну и ту же тройку для каждого instance. Я бы предположил, что это не последний, упомянутый в файле, а скорее [instance, hasDestBytes, ...] triple, основанный на каком-то артефакте того, как троики хранятся или индексируются. В любом случае, поскольку это всего лишь результат подстановочного соответствия, поведение, вероятно, точно не определено. Сделайте что-то подобное, и все должно быть установлено:

String ns = "http://www.semanticweb.org/ontologies/2013/3/Ontology1365003423152.owl#"; 
OntClass clas = inf.getOntClass(ns + "Attack"); 
p[0] = inf.getOntProperty(ns + "HasProtocol"); 
p[1] = inf.getOntProperty(ns + "HasService");