簡體   English   中英

Jena-從QuerySolution訪問模型中的元素並更新它們

[英]Jena - Access elements in model from a QuerySolution and update them

我想使用通過Protégé5創建的一個測試模型執行簡單的操作。就我而言,我在owl文件中有一個用戶定義了這種方式:

<owl:NamedIndividual rdf:about="&user-test-2;u01">
    <rdf:type rdf:resource="&user-test-2;user"/>
    <user-test-2:email rdf:datatype="&xsd;string">email1@test.net</user-test-2:email>
    <user-test-2:hasGender rdf:resource="&user-test-2;male"/>
    <user-test-2:isYearsOld rdf:resource="&user-test-2;18-24"/>
</owl:NamedIndividual>

我已經能夠正確加載模型並使用SPARQL執行基本搜索以獲取男性用戶和相關屬性,從而獲得以下結果:

        String fileName = "user-test-2.owl";
        Model model = RDFDataMgr.loadModel(fileName);
        final String ns = "http://www.semanticweb.org/ontologies/user-test-2#";


        String queryString =  "PREFIX test: <http://www.semanticweb.org/ontologies/user-test-2#> "
            + "SELECT ?subject "
            + "WHERE { ?subject test:hasGender test:male } ";
        QueryExecution qe = QueryExecutionFactory.create(query, model);
        ResultSet results =  qe.execSelect();
        ResultSetFormatter.out(System.out, results, query);

        ------------
        | subject  |
        ============
        | test:u01 |
        -----------

現在,我想訪問owl:NamedIndividual的屬性並更新其中之一。 例如,更改用戶的電子郵件。

編輯

我已經可以使用以下代碼訪問屬性:

        Property emailDp = model.getProperty(ns + "email"); 
        Property isYearsOld = model.getProperty(ns + "isYearsOld"); 

        for ( ; results.hasNext() ; ) {
          QuerySolution soln = results.nextSolution() ;
          Resource res = soln.getResource("subject");
          Resource user = model.getResource( res.getURI());  

          System.out.println(user.getProperty(emailDp));
          System.out.println(user.getProperty(isYearsOld));
    }

現在,我需要更新其中之一。

目前,我還沒有找到任何有用的示例來執行此類操作,因此歡迎您提供任何幫助。

提前致謝。

因此,您想更新給定用戶的屬性emailDpisYearsOld

假設一個用戶只有一個電子郵件地址和/或一個年齡,我們可以通過調用以下方法直接獲得該屬性:

Statement emailStatement = user.getProperty(emailDp);
Statement ageStatement = user.getProperty(isYearsOld);

然后可以使用以下方式檢索用戶的年齡或電子郵件:

Resource email = (Resource) emailStatement.getObject();
Resource age = (Resource) ageStatement.getObject();

可以通過以下方法輕松地更新其中之一:

user.removeProperty(emailDp, email);
user.removeProperty(isYearsOld, age);

user.addProperty(emailDp, newEmail);
user.addProperty(isYearsOld, newAge);

如果用戶的任一個user.removeAll(emailDp)一個,則您將必須用新的電子郵件地址將所有舊的電子郵件地址替換為user.removeAll(emailDp)或在執行操作並執行任何形式的檢查時遍歷列表,然后才能進行設備安裝;以及刪除您想要的那個,類似於上面的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM