我正在尝试显示我的本体实例的数据属性值。我正在使用耶拿这个目的。我的实例如下:
<!-- 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>
我使用Jena的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后跟7次293)。我想我做错了,因为它为一切检索相同的值。我看到它的方式只是打印每个实例的最后一个数据属性值。
答案 0 :(得分:2)
正如您需要在
中指定整个IRI一样inf.getOntClass("http://www.semanticweb.org/ontologies/2013/3/Ontology1365003423152.owl#Attack");
您需要在
中指定整个IRIp[0] = inf.getOntProperty("HasProtocol");
由于可能不是具有IRI HasProtocol
的OntProperty,p[0]
(其余的)被设置为null
,并且在许多地方Jena API解释null
作为通配符。所以
instance.getPropertyValue(p[0]).toString());
只是查询模型中的三元组,instance
作为主语,任何谓词和任何对象。 Jena恰好每次都为每个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");