对于GeoSPARQL测试项目,我希望在Jena中设置自定义数据类型。当我通过Jena网站上提供的the example进行尝试时,它仍然不起作用。我得到以下结果:
_:b0 <http://www.opengis.net/ont/geosparql#asWKT> "POINT (52.83525867111958 6.870789811954563)^^http://www.opengis.net/ont/sf#wktLiteral "^^<java:com.hp.hpl.jena.rdf.model.impl.LiteralImpl> .
当然我不想java:com.hp.hpl.jena.rdf.model.impl.LiteralImpl
而是http://www.opengis.net/ont/sf#wktLiteral
因为我想使用GeoSPARQL。在this page上,他们拥有与我的三重商店和空间索引完美匹配的示例数据。但是上述数据根本不适用于空间索引。
所以,我的问题是,我是否在Jena的RDF中定义了一个自定义数据类型?
答案 0 :(得分:2)
语法是
"POINT (52.83525867111958 6.870789811954563)"^^<http://www.opengis.net/ont/sf#wktLiteral>
答案 1 :(得分:0)
经过大量的试验和错误,我刚刚找到了问题的答案。要向我的RDF模型添加自定义RDFDatatype
,我首先必须创建我自己的类BaseDatetype
,我调用WktLiteral
,看起来像这样:
public class WktLiteral extends BaseDatatype {
public static final String TypeURI = "http://www.opengis.net/ont/sf#wktLiteral";
public static final String CRS84 = "<http://www.opengis.net/def/crs/OGC/1.3/CRS84>";
public static final RDFDatatype wktLiteralType = new WktLiteral();
private WktLiteral() {
super(WktLiteral.TypeURI);
}
/**
* Convert a value of this datatype out
* to lexical form.
*/
public String unparse(Object value) {
return value.toString();
}
/**
* Parse a lexical form of this datatype to a value
*/
public Object parse(String lexicalForm) {
return new TypedValue(String.format("%s %s", WktLiteral.CRS84, lexicalForm), this.getURI());
}
/**
* Compares two instances of values of the given datatype.
* This does not allow rationals to be compared to other number
* formats, Lang tag is not significant.
*
* @param value1 First value to compare
* @param value2 Second value to compare
* @return Value to determine whether both are equal.
*/
public boolean isEqual(LiteralLabel value1, LiteralLabel value2) {
return value1.getDatatype() == value2.getDatatype()
&& value1.getValue().equals(value2.getValue());
}
在TypedLiteral
方法中返回parse()
非常重要。之后,我必须执行以下操作以向RDF模型添加内容:
TypeMapper.getInstance().registerDatatype(WktLiteral.wktLiteralType);
item.addLiteral(GeoSPARQL.asWKT, ResourceFactory.createTypedLiteral(geom, WktLiteral.wktLiteralType));
GeoSPARQL.asWKT
是我通过schemagen
生成的GeoSPARQL词汇表中的谓词。 geom
是几何对象和众所周知的文本,WktLiteral.wktLiteralType
是上述类的实例。
总之,结果如下(符号3):
_:b0 <http://www.w3.org/2003/01/geo/wgs84_pos#lat_long> "POINT (51.61821756986111 5.542408362751153)" .
因此正是我想要的......感谢所有的输入。