我稍微改变了命名空间,只是为了让这段代码最终指向这篇文章,但无论如何,我得到了这个输出:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<rdf:Property rdf:about="http://stackoverflow.com/q/20194409/1281433/PropertyName">
<rdfs:range rdf:resource="http://www.w3.org/2000/01/rdf-schema#Literal"/>
<rdfs:domain rdf:resource="http://stackoverflow.com/q/20194409/1281433/ClassName"/>
</rdf:Property>
</rdf:RDF>
从此代码:
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.vocabulary.RDFS;
public class JenaPropertyExample {
public static void main(String[] args) {
final String NS = "http://stackoverflow.com/q/20194409/1281433/";
final Model model = ModelFactory.createDefaultModel();
final Property p = model.createResource( NS+"PropertyName", RDF.Property ).as( Property.class );
p.addProperty( RDFS.domain, model.createResource( NS+"ClassName" ));
p.addProperty( RDFS.range, RDFS.Literal );
model.write( System.out, "RDF/XML-ABBREV" );
}
}
一般来说,仅仅因为输出是合法的 RDF 并不意味着您正在以预期的方式使用属性和类。Jena 的简单Model
界面无法帮助您太多,因为您仍然可能错误地使用属性,但至少,如果您使用 Jena 的预定义词汇类,您将获得正确的 IRI。不过,如果您可以使用 OntModel,您可以获得更好的抽象层。例如,以下方法产生相同的 RDF/XML 输出,但允许您使用createOntProperty
和免费获取p rdf:type rdf:Property
三元组之类的方法,以及和之类addRange
的方法addDomain
:
public static void main2( String[] args ) {
final String NS = "http://stackoverflow.com/q/20194409/1281433/";
final OntModel model = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM );
OntProperty p = model.createOntProperty( NS+"PropertyName" );
p.addDomain( model.getOntClass( NS+"ClassName" ));
p.addRange( RDFS.Literal );
model.write( System.out, "RDF/XML-ABBREV" );
}