Rdf 添加ObjectProperty断言
我在添加一个OWL类(类a)的个体时遇到了一个问题,该个体具有许多ObjectProperty(比如A1,A2…),其范围与其他OWL类(A1的范围是OWL类B,A2的范围是OWL类C…)相同,因此类B,C具有一些DatatypeProperty或ObjectProperty,具有一些特定的数据类型,如String,float,double。 据我所知,我们可以添加以下人员:Rdf 添加ObjectProperty断言,rdf,jena,owl,Rdf,Jena,Owl,我在添加一个OWL类(类a)的个体时遇到了一个问题,该个体具有许多ObjectProperty(比如A1,A2…),其范围与其他OWL类(A1的范围是OWL类B,A2的范围是OWL类C…)相同,因此类B,C具有一些DatatypeProperty或ObjectProperty,具有一些特定的数据类型,如String,float,double。 据我所知,我们可以添加以下人员: Individual i = A.createIndividual(NS+"nameOfIndividual"); 然
Individual i = A.createIndividual(NS+"nameOfIndividual");
然后向其添加属性,如:
i.addProperty(Property prop, "value");
但通过这种方式,所有值都作为字符串文字添加,并且不引用为该属性定义的范围。此外,如果类级别的层次结构超过两个级别,我发现很难深入到基本数据类型属性。Resource.addProperty的方法签名重载。如果您查看,您将看到它具有以下多态变体:
addProperty(属性p,RDFNode o)
addProperty(属性p,字符串o)
addProperty(属性p、字符串字典格式、RDFDatatype数据类型)
addProperty(属性p、字符串o、字符串l)
RDFNode
是资源
的超类型,因此也是单个
、OntClass
等的超类型。因此,您只需传入一个已经是RDFNode的值
为了使这一点具体化,以下是您如何维护两个人之间的关系:
Individual ai = A.createIndividual(NS+"nameOfIndividualInA");
Individual bi = B.createIndividual(NS+"nameOfIndividualInB");
Property p = A.createObjectProperty( NS + "p" );
// either
ai.addProperty( p, bi );
// or
model.add( ai, p, bi );
更新
作为对注释的响应,下面是一些实际的可运行代码,显示了调用这些API方法的各种方式:
package examples;
import java.util.Calendar;
import com.hp.hpl.jena.datatypes.TypeMapper;
import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import com.hp.hpl.jena.rdf.model.*;
public class AddPropertiesExample
{
public static final String NS = "http://example.com/test#";
private Property p;
private Resource r, s;
public static void main( String[] args ) {
new AddPropertiesExample().run();
}
public void run() {
Model m = createModel();
// add property values using the Model.add( Resource, Property, RDFNode) signature
m.add( r, p, s );
m.add( r, p, ResourceFactory.createPlainLiteral( "foo" ) );
m.add( r, p, ResourceFactory.createLangLiteral( "le foo", "fr" ) );
m.add( r, p, ResourceFactory.createTypedLiteral( 42 ) );
m.add( r, p, ResourceFactory.createTypedLiteral( Calendar.getInstance() ));
// ditto using the Model.add( Resource, Property, String ) signature
m.add( r, p, "This is a plain literal" );
// ditto using the Model.add( Resource, Property, String, String ) signature
m.add( r, p, "Das foo", "de" );
// ditto using the Model.add( Resource, Property, String, RDFDatatype ) signature
m.add( r, p, "42.42", XSDDatatype.XSDfloat );
m.add( r, p, "2000-01-01",
TypeMapper.getInstance().getTypeByName( "http://www.w3.org/2001/XMLSchema#date" ) );
m.write( System.out, "Turtle" );
}
private Model createModel() {
Model m = ModelFactory.createOntologyModel();
p = m.createProperty( NS + "p" );
r = m.createResource( NS + "r" );
s = m.createResource( NS + "s" );
return m;
}
}
输出:
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://example.com/test#r>
<http://example.com/test#p> "2000-01-01"^^xsd:date ,
"42.42"^^xsd:float ,
"Das foo"@de ,
"This is a plain literal" ,
"2013-10-28T11:46:35.596Z"^^xsd:dateTime ,
"42"^^xsd:int ,
"le foo"@fr ,
"foo" ;
<http://example.com/test#p> <http://example.com/test#s> .
@前缀rdfs:。
@前缀owl:。
@前缀xsd:。
@前缀rdf:。
“2000-01-01”日期:,
“42.42”^^xsd:float,
“Das foo”@de,
“这是一个简单的文字”,
“2013-10-28311:46:35.596Z”^^xsd:dateTime,
“42”^^xsd:int,
“乐富”@fr,
“福”;
.
我不明白您所说的“如果类级别的层次结构超过两个级别,我发现很难深入到基本数据类型属性”是什么意思。您能澄清一下吗?Ian,为了使用第四个变量Resource.addProperty(属性p,字符串o,字符串l)
,字符串l参数是什么?它是XSD的URI吗?例如:?我可以使用第二个变量添加实例。但为了添加带有文字值的DataTypProperty,问题仍然存在。我的主要目标是根据使用中的datatypeProperty范围在运行时获得的数据类型添加文字值。我认为第三个和第四个vairant是我在本例中需要的变量,但对于参数lexicalForm和第三个变量的RDFDatatype以及第四个变量的字符串l,javadoc中的情况并不清楚。我们如何从DatatypeProperty.getRange()
获取RDFDatatype
??如果我使用下面的代码添加一个个体:m.add(r,p,“42.42”,TypeMapper.getInstance().getTypeByName(“http://www.w3.org/2001/XMLSchema#float" ) );
然后按如下方式触发sparql查询:选择*WHERE{s?o 42.42}代码>查询是否会返回上面添加的单个条目?