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

耶拿;RDFS:从外部本体获取属性,rdf,jena,ontology,rdfs,Rdf,Jena,Ontology,Rdfs,我有一个RDFS本体,其中包含一个User类: 用户类,foaf:Agent类的子类。 foaf:Agent类有一个名为name的属性,我想使用Jena加载该属性,它类似于: Property name = model.getOntProperty(ns + "name"); 问题是,当我尝试像这样使用它时,会得到一个NullPointerException: model.createStatement(resource, name, "Nicolas Cage"); 我也尝试过foaf

我有一个RDFS本体,其中包含一个
User
类:


用户类,foaf:Agent类的子类。
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不会自动在外部本体中找到它吗?

Jena不会仅仅因为提到它就自动加载它

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

只是提到了代理的名字,并没有提到获取它。它只是RDF的任何旧URI—它可能不存在。

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

import org.apache.jena.riot.RDFDataMgr;
导入org.apache.jena.riot.RDFFormat;
导入com.hp.hpl.jena.rdf.model.model;
导入com.hp.hpl.jena.rdf.model.ModelFactory;
导入com.hp.hpl.jena.rdf.model.Property;
导入com.hp.hpl.jena.rdf.model.Resource;
导入com.hp.hpl.jena.rdf.model.Statement;
公共类UseFoafNameExample{
公共静态void main(字符串[]args){
模型模型=ModelFactory.createDefaultModel();
属性名称=model.createProperty(“http://xmlns.com/foaf/0.1/name" );
Resource=model.createResource(“http://stackoverflow.com/q/23818390/1281433/NicholasCage" );
语句s=model.createStatement(资源,名称,“NicholasCage”);
模型。添加(s);
RDFDataMgr.write(System.out、model、RDFFormat.RDFXML_ABBREV);
}
}

尼古拉斯·凯奇
现在,你的问题中还有一个问题

代理类有一个名为name的属性,我想 使用类似于以下内容的Jena加载:

Property name = model.getOntProperty(ns + "name");
代理类没有属性;RDFS(和OWL)类不是这样工作的。有一个属性
name
Agent
作为
rdfs:domain
(我没有检查这是否是实际情况,但听起来很合理,我猜这就是产生混淆的原因)。这意味着当你有一个三元组

x foaf:name "some name"
你可以推断

当然,要进行这种推理,你需要知道三重数

foaf:name rdfs:domain foaf:Agent

这就是您可能希望从其他地方加载本体的内容。也就是说,你想得到它包含的公理,这样你就可以用它们进行推理。

请提供一个完整的、最少的例子。细节很重要。空指针是由于其他原因造成的-请检查stacktrace。创建属性不需要加载任何内容。属性由URI标识,您只需引用URI即可,使用
Property name=model.getOntProperty(ns+“name”)如果事实上,
ns
http://xmlns.com/foaf/0.1/
。因此,您要说的是,在RDF中,您不必将资源定义为
foaf:Agent
,只要创建它并将其链接到
foaf:name
属性?如果您断言
x foaf:name“foo”
您有三个
foaf:name rdfs:domain foaf:Agent
和一个推理器,然后您可以推断
x rdf:type foaf:Agent