java - 从本体实例中提取数据属性值

标签 java eclipse rdf jena ontology

我正在尝试显示本体实例的数据属性值。我为此目的使用耶拿。我的实例如下:

<!-- 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());
     }
}

现在,第一次打印迭代仅打印 0,而第二次仅打印 293(7 乘以 0,然后是 7 乘以 293)。我想我做错了什么,因为它为所有东西检索相同的值。我认为它只是打印每个实例的最后一个数据属性值。

最佳答案

就像您需要在

中指定整个 IRI 一样
inf.getOntClass("http://www.semanticweb.org/ontologies/2013/3/Ontology1365003423152.owl#Attack");

您需要在

中指定整个IRI
p[0] = inf.getOntProperty("HasProtocol");

由于 IRI HasProtocol 可能没有 OntProperty,因此 p[0](以及其余部分)被设置为 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");

关于java - 从本体实例中提取数据属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265759/

相关文章:

java - 从 JNI/C++ 代码使用 java 套接字

eclipse - 如何通过 git 共享 papyrus 项目?

xml - 是否可以使用 xsd 数据类型(例如 xsd :string) and xml language attribute simultaneously in OWL2/RDF?

月出颜色主题的 eclipse : change button color

java - CraftBukkit 插件编码错误

database - 基于RDF的异构关系数据库集成是如何工作的?

python - 在 rdf/n3 文件中按名称搜索

java - 如何抓取给定标签内的字符串?

java - Spring 数据JPA : Saving nested OneToMany children (with cascading) returns NULL parent foreign object

java - 使用 Spring JDBC batchUpdate 时是否有获取生成的 key ?