2013-04-28 81 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代码中使用耶拿如下:

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,随后到293倍)。我想我正在做一些错误的事情,因为它为所有事物检索相同的值。我看到它的方式只是打印每个实例的最后一个数据属性值。

回答

2

正如你需要在

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

指定整个IRI你需要

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

指定整个IRI因为有可能不与IRI HasProtocolp[0]的OntProperty(和其余)被设置为null,并且在很多地方,Jena API将null解释为通配符。所以

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

只是查询三合为一的模型instance为主体,任何断言和任何对象。 Jena每次都会为每个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");