耶拿& RDFS:从外部本体获取属性

时间:2014-05-22 22:57:20

标签: rdf jena ontology rdfs

我有一个带有User类的RDFS本体:

<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不会在外部本体中自动找到它吗?

2 个答案:

答案 0 :(得分: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" (我没有检查确实是这种情况,但这听起来很合理,而且我&#39;}我猜这是混乱的起因)。这意味着,当你有一个三重

x rdf:type foaf:Agent

你可以推断那个

foaf:name rdfs:domain foaf:Agent

当然,要做那种推理,你需要了解三重

{{1}}

你可能希望从其他地方加载本体。即,你想得到它所包含的公理,这样你就可以用它们来推理。

答案 1 :(得分:0)

Jena不会因为提到而自动加载。

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

只是提到了Agent这个名称而没有提到它。它只是RDF的任何旧URI - 它可能不存在。