0

我有一个 RDFS 本​​体,其User类如下:

<rdfs:Class rdf:ID="User"> 
    <rdfs:subClassOf rdf:resource="http://xmlns.com/foaf/0.1/Agent" />
    <rdfs:comment> 
        The class of users, subclassing the foaf:Agent class.
    </rdfs:comment>  
</rdfs:Class>

该类foaf:Agent有一个名为 的属性name,我想使用 Jena 加载它,其内容类似于:

Property name = model.getOntProperty(ns + "name");

问题是当我尝试像这样使用它时得到一个 NullPointerException :

model.createStatement(resource, name, "Nicolas Cage");

我也尝试过使用 foaf 标准命名空间 ( ns = "http://xmlns.com/foaf/0.1/";),尽管我不确定这有多大意义。

最后,我不知道什么是正确的方法。我应该创建它吗?Jena 不会以某种方式在外部本体中自动找到它吗?

4

2 回答 2

1

在 RDF 中,资源(包括属性)由 URI标识。您需要加载这些 URI是没有意义的。有时,由 URI 标识的文档可能包含您想要的语句,在这种情况下,您需要加载包含这些语句的文档,但这与简单地引用属性不同。这是一个例子:

import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;

public class UseFoafNameExample {
    public static void main(String[] args) {
        Model model = ModelFactory.createDefaultModel();
        Property name = model.createProperty( "http://xmlns.com/foaf/0.1/name" );
        Resource resource = model.createResource( "http://stackoverflow.com/q/23818390/1281433/NicholasCage" );
        Statement s = model.createStatement( resource, name, "Nicholas Cage" );
        model.add( s );
        RDFDataMgr.write( System.out, model, RDFFormat.RDFXML_ABBREV );
    }
}
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://xmlns.com/foaf/0.1/">
  <rdf:Description rdf:about="http://stackoverflow.com/q/23818390/1281433/NicholasCage">
    <j.0:name>Nicholas Cage</j.0:name>
  </rdf:Description>
</rdf:RDF>

现在,您的问题中还有另一个问题。

foaf:Agent 类有一个名为 name 的属性,我想使用 Jena 加载它,类似于:

foaf:Agent 类没有属性;这不是 RDFS(和 OWL)类的工作方式。有一个属性name作为Agent一个rdfs:domain(我没有检查是否确实如此,但这听起来很合理,我猜这就是产生混淆的地方)。这意味着当你有一个三倍

x foaf:name "some name"

你可以推断

x rdf:type foaf:Agent

当然,要进行这种推断,您需要了解三元组

foaf:name rdfs:domain foaf:Agent

就是您可能想要从其他地方加载本体的内容。即,您想获得它包含的公理,以便您可以对它们进行推理。

于 2014-05-23T21:52:48.470 回答
0

Jena 不会因为被提及而自动加载某些内容。

rdf:resource="http://xmlns.com/foaf/0.1/Agent"

只是提到了代理这个名字,并没有说要取它。它只是 RDF 的任何旧 URI - 它可能不存在。

于 2014-05-23T14:48:56.923 回答