Извлечение значения свойства данных из экземпляра онтологии

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

<!-- 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). Я предполагаю, что я делаю что-то не так, поскольку он получает одинаковое значение для всего Я вижу только печать последних значений свойств данных каждого экземпляра.

1 ответ

Так же, как вам нужно указать весь 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и во многих местах Jena API интерпретирует null как подстановочный знак. Так

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

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

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");
Другие вопросы по тегам