Jena - 从QuerySolution访问模型中的元素并更新它们

时间:2015-07-19 18:34:47

标签: java sparql jena

我想使用我使用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));
    }

现在我需要更新其中一个。

目前我还没有找到任何有用的例子来执行这些事情,所以欢迎任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

因此,您要更新给定用户的属性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)替换所有旧的电子邮件地址,或者按照您的方式迭代列表并执行任何类型的检查,并删除你想要的那个,类似于上面的例子。