【问题标题】:Accessing Object Property for Individual using Apache Jena使用 Apache Jena 访问个人的对象属性
【发布时间】:2021-12-08 21:15:55
【问题描述】:

我使用 Protégé 创建了一个 OWL 本体,描述了一个患者数据库系统。我现在正在尝试使用 Apache Jena 开发 Java 代码来读取我创建的 OWL 文件,然后对其执行一些操作。我的主要目标是让我的代码能够按名称(例如患者姓名)找到特定个体,然后访问该个体的特定对象属性,并输出其值。例如,患者“John”具有对应于另一个个体“Amy”的对象属性“Treated_By”(Amy 是类型为医生的个体)。但是,我一直无法弄清楚使用哪种 Jena 方法从某个人那里检索 Object 属性值。

这是我的代码(请忽略 cmets,它们是此任务之前尝试的片段):

public class Main {

public static void main(String[] args) {
    OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
    String fileName = "C:/Users/Ahmed Medhat/Documents/assignment1ontv3.0.owl";

    try {
        InputStream inputStream = new FileInputStream(fileName);
        model.read(inputStream, "RDF/XML");
        //model.read(inputStream, "OWL/XML");
        inputStream.close();
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter Patient Name: ");
    String patientName = sc.next();

    ExtendedIterator<Individual> itI = model.listIndividuals();

    while (itI.hasNext()) {
        Individual i = itI.next();
        String localName = i.getLocalName();
        //System.out.println(patientName);
        //System.out.println(localName);
        if(localName.equals(patientName))
        {
            //System.out.println("Conditional Code Accessed.");
            OntClass Class = i.getOntClass();
            System.out.println("Patient Disease is: " + Class.listDeclaredProperties());
        }
        System.out.println("Failed.");
    }
}



}

【问题讨论】:

    标签: java owl jena ontology


    【解决方案1】:

    试试这个(相应地替换属性 URI):

    final Property p = model.createObjectProperty("http://example.org/Treated_by");
    final RDFNode object = i.getPropertyValue(p);
    

    【讨论】:

    • 感谢您的回答,此方法效果很好,但我面临两个问题。第一个是输出总是属性的 IRI,我需要它来输出它的友好名称。第二个问题是,当同一个属性名下有多个实例时(例如一个病人服用多种药物),这个方法只输出第一个属性,而忽略其余的。
    • @AhmedMedhat 1) “友好名称”必须在数据中,您的属性在您的本体中是否有 rdfs:label。这是最好的做法。或者您使用并不总是人类可读的本地名称。 2) 改为致电listPropertyValues。我还要指出documentationJavadoc 以供将来参考。
    • 谢谢!使用rdfs:label 非常适合检索友好名称,listPropertyValues 对于多个实例也是如此,我所要做的就是简单的节点转换,然后在迭代器中分别输出每个节点值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多