【问题标题】:Unable to retrieve results from owl using Jena无法使用 Jena 从 owl 检索结果
【发布时间】:2012-12-20 08:04:15
【问题描述】:

首先,我使用 Protege 4 创建了自己的示例本体。我的实际目标是开发一个语义 Web 应用程序,该应用程序可以从对象属性中受益,从而为用户提供一些东西。创建本体后,我将添加动态数据,因此我需要使用 *Jena API *。为了演示,我创建了示例实例。但是当我尝试检索结果时,我什么也没得到。

也许我在 SPARQL 查询中遗漏了某些内容。

private static final String baseUri = "http://www.semanticweb.org/ontologies/alisveris.owl#";

private static void modelReadFile(String filename, Model model) {
    try {
        File f = new File(filename);
        FileReader fr = new FileReader(f);
        model.read(fr, baseUri);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}


private static void printModel(Model model) {
    String queryString =
        "PREFIX lib: <http://www.semanticweb.com/ontologies/alisveris.owl>" +
        "SELECT ?name ?surname " +
        "FROM <http://www.semanticweb.com/ontologies/alisveris.owl>" +
        "WHERE {" +
        "?name lib:take \"JavaProgramming\" " +
        "}";
    System.out.println(queryString);
    Query query = QueryFactory.create(queryString);
    QueryExecution qe = QueryExecutionFactory.create(query, model);
    ResultSet results = qe.execSelect();
    ResultSetFormatter.out(System.out, results, query);
    qe.close();
}


public static void main(String[] args) {
    Model model = ModelFactory.createDefaultModel();
    modelReadFile("/home/talha/ontologies/alisveris.owl", model);

    // Create properties for the different types of relationship to represent
    Property take = model.createProperty(baseUri, "take");
    Property isTakenBy = model.createProperty(baseUri, "isTakenBy");
    Property published = model.createProperty(baseUri, "published");
    Property publishedBy = model.createProperty(baseUri, "publishedBy");

    // User data properties
    Property userId = model.createProperty(baseUri, "userId");
    Property name = model.createProperty(baseUri, "name");
    Property surname = model.createProperty(baseUri, "surname");
    Property username = model.createProperty(baseUri, "username");
    Property password = model.createProperty(baseUri, "password");
    Property gender = model.createProperty(baseUri, "gender");
    Property age = model.createProperty(baseUri, "age");
    // Publisher data properties
    Property publisherId = model.createProperty(baseUri, "publisherId");
    Property publisherName = model.createProperty(baseUri, "publisherName");
    // Book data properties
    Property bookId = model.createProperty(baseUri, "bookId");
    Property bookName = model.createProperty(baseUri, "bookName");
    Property bookGenre = model.createProperty(baseUri, "bookGenre");
    Property pageCount = model.createProperty(baseUri, "pageCount");
    Property isbn = model.createProperty(baseUri, "isbn");
    Property bookRating = model.createProperty(baseUri, "bookRating");


    Resource talha = model.createResource(baseUri + "Talha");
    Resource javaProgramming = model.createResource(baseUri + "JavaProgramming");
    // and so on for other family members

    talha.addProperty(userId, "1");
    talha.addProperty(name, "Talha");
    talha.addProperty(surname, "Kabakuş");
    talha.addProperty(username, "talhak");
    talha.addProperty(password, "00");
    talha.addProperty(gender, "1");
    talha.addProperty(age, "23");


    javaProgramming.addProperty(bookId, "1");
    javaProgramming.addProperty(publisherId, "1");
    javaProgramming.addProperty(bookName, "Java Programming");
    javaProgramming.addProperty(bookGenre, "1");
    javaProgramming.addProperty(pageCount, "200");
    javaProgramming.addProperty(isbn, "121321312");
    javaProgramming.addProperty(bookRating, "3");

    // Add properties to adam describing relationships to other family members
    talha.addProperty(take, javaProgramming);

    Statement s = ResourceFactory.createStatement(talha, take, javaProgramming);
    model.add(s); // add the statement (triple) to the model
    printModel(model);
}

这是我得到的结果:

------------------
| name | surname |
==================
------------------

最后是我的示例本体:

<?xml version="1.0"?>


<!DOCTYPE rdf:RDF [
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <!ENTITY alisveris "http://www.semanticweb.org/ontologies/alisveris.owl#" >
]>


<rdf:RDF xmlns="http://www.semanticweb.org/ontologies/alisveris.owl#"
     xml:base="http://www.semanticweb.org/ontologies/alisveris.owl"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:alisveris="http://www.semanticweb.org/ontologies/alisveris.owl#">
    <owl:Ontology rdf:about="http://www.semanticweb.org/ontologies/alisveris.owl"/>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Object Properties
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#isTakenBy -->

    <owl:ObjectProperty rdf:about="&alisveris;isTakenBy">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
        <rdfs:range rdf:resource="&alisveris;User"/>
    </owl:ObjectProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#published -->

    <owl:ObjectProperty rdf:about="&alisveris;published">
        <rdfs:range rdf:resource="&alisveris;Book"/>
        <rdfs:domain rdf:resource="&alisveris;Publisher"/>
    </owl:ObjectProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#publishedBy -->

    <owl:ObjectProperty rdf:about="&alisveris;publishedBy">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
        <rdfs:range rdf:resource="&alisveris;Publisher"/>
        <owl:inverseOf rdf:resource="&alisveris;published"/>
    </owl:ObjectProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#take -->

    <owl:ObjectProperty rdf:about="&alisveris;take">
        <rdfs:range rdf:resource="&alisveris;Book"/>
        <rdfs:domain rdf:resource="&alisveris;User"/>
        <owl:inverseOf rdf:resource="&alisveris;isTakenBy"/>
    </owl:ObjectProperty>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Data properties
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#age -->

    <owl:DatatypeProperty rdf:about="&alisveris;age">
        <rdfs:domain rdf:resource="&alisveris;User"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#bookGenre -->

    <owl:DatatypeProperty rdf:about="&alisveris;bookGenre">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#bookId -->

    <owl:DatatypeProperty rdf:about="&alisveris;bookId">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#bookName -->

    <owl:DatatypeProperty rdf:about="&alisveris;bookName">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#bookRating -->

    <owl:DatatypeProperty rdf:about="&alisveris;bookRating">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#gender -->

    <owl:DatatypeProperty rdf:about="&alisveris;gender">
        <rdfs:domain rdf:resource="&alisveris;User"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#isbn -->

    <owl:DatatypeProperty rdf:about="&alisveris;isbn">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#name -->

    <owl:DatatypeProperty rdf:about="&alisveris;name">
        <rdfs:domain rdf:resource="&alisveris;User"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#pageCount -->

    <owl:DatatypeProperty rdf:about="&alisveris;pageCount">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#password -->

    <owl:DatatypeProperty rdf:about="&alisveris;password">
        <rdfs:domain rdf:resource="&alisveris;User"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#publisherId -->

    <owl:DatatypeProperty rdf:about="&alisveris;publisherId">
        <rdfs:domain rdf:resource="&alisveris;Book"/>
        <rdfs:domain rdf:resource="&alisveris;Publisher"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#publisherName -->

    <owl:DatatypeProperty rdf:about="&alisveris;publisherName">
        <rdfs:domain rdf:resource="&alisveris;Publisher"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#rating -->

    <owl:DatatypeProperty rdf:about="&alisveris;rating"/>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#surname -->

    <owl:DatatypeProperty rdf:about="&alisveris;surname">
        <rdfs:domain rdf:resource="&alisveris;User"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#userId -->

    <owl:DatatypeProperty rdf:about="&alisveris;userId">
        <rdfs:domain rdf:resource="&alisveris;User"/>
    </owl:DatatypeProperty>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#username -->

    <owl:DatatypeProperty rdf:about="&alisveris;username">
        <rdfs:domain rdf:resource="&alisveris;User"/>
    </owl:DatatypeProperty>



    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Classes
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->




    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#Book -->

    <owl:Class rdf:about="&alisveris;Book">
        <owl:disjointWith rdf:resource="&alisveris;Publisher"/>
    </owl:Class>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#Female -->

    <owl:Class rdf:about="&alisveris;Female">
        <rdfs:subClassOf rdf:resource="&alisveris;Gender"/>
        <owl:disjointWith rdf:resource="&alisveris;Male"/>
    </owl:Class>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#Gender -->

    <owl:Class rdf:about="&alisveris;Gender"/>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#Male -->

    <owl:Class rdf:about="&alisveris;Male">
        <rdfs:subClassOf rdf:resource="&alisveris;Gender"/>
    </owl:Class>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#Publisher -->

    <owl:Class rdf:about="&alisveris;Publisher">
        <rdfs:subClassOf rdf:resource="&owl;Thing"/>
    </owl:Class>



    <!-- http://www.semanticweb.org/ontologies/alisveris.owl#User -->

    <owl:Class rdf:about="&alisveris;User"/>
</rdf:RDF>

【问题讨论】:

标签: semantics sparql semantic-web jena protege


【解决方案1】:
PREFIX lib: <http://www.semanticweb.com/ontologies/alisveris.owl>

你需要一个#来同意baseURI:

PREFIX lib: <http://www.semanticweb.com/ontologies/alisveris.owl#>

你也不需要

FROM <http://www.semanticweb.com/ontologies/alisveris.owl>

您正在使用model 提供数据。

【讨论】:

  • 非常感谢您的回复;我根据您的建议更改了代码,但还是一样。
  • 尝试在构建后和查询前打印出模型,以确保数据符合查询的预期。您无需阅读本体 - 这是一个纯数据问题。
  • 但我在本体中定义了对象和数据属性。我所需要的只是创建一个本体模型并通过该模型加载数据。当我打印出模型时,我看到了我在本体中定义的确切内容。请您指导我如何实现我的目标?
  • 我创建了另一个查询,列出了图书及其所有者的姓名:PREFIX lib: &lt;http://www.semanticweb.com/ontologies/alisveris.owl#&gt; PREFIX book: &lt;http://www.semanticweb.com/ontologies/alisveris.owl#JavaProgramming&gt; SELECT ?bookName1 ?name1 WHERE { ?book1 lib:isTakenBy ?user1 . ?user1 lib:name ?name1 . ?book1 lib:bookName ?bookName1 . } 这也没有返回任何内容。
【解决方案2】:

这个答案也在the duplicate on answers.semanticweb.com

您的查询要求一个三元组,其中对象是文字"JavaProgramming",但代码Resource javaProgramming = model.createResource(baseUri + "JavaProgramming"); 创建了一个资源。您需要查询资源而不是字符串。除了本体代码之外,您创建的模型是这样的(注意我们看到的是:JavaProgramming,而不是"JavaProgramming"):

@prefix :      <http://www.semanticweb.org/ontologies/alisveris.owl#> .

:JavaProgramming  :bookGenre  "1" ;
        :bookId       "1" ;
        :bookName     "Java Programming" ;
        :bookRating   "3" ;
        :isbn         "121321312" ;
        :pageCount    "200" ;
        :publisherId  "1" .

:Talha  :age       "23" ;
        :gender    "1" ;
        :name      "Talha" ;
        :password  "00" ;
        :surname   "Kabakuş" ;
        :take      :JavaProgramming ;
        :userId    "1" ;
        :username  "talhak" .

在此数据上,您可以运行以下查询(使用:JavaProgramming)并获得以下结果。

prefix :      <http://www.semanticweb.org/ontologies/alisveris.owl#>

select ?student ?name ?surname where {
  ?student :take :JavaProgramming ;
           :name ?name ;
           :surname ?surname .
}
---------------------------------
| student | name    | surname   |
=================================
| :Talha  | "Talha" | "Kabakuş" |
---------------------------------

【讨论】:

  • 在 answers.semanticweb 上问的那个是我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多