我只是找到了答案,我的問題了很多的試驗和錯誤之後。要自定義RDFDatatype
添加到我的RDF模式,我首先必須創建自己的類,它擴展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());
}
如果這是很重要的是要在parse()
方法返回一個TypedLiteral
。這之後,我不得不做的東西添加到我的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)" .
從而正是我想要的......感謝所有的輸入。
所以,只是爲了讓它顯得非常明顯:在問題中,字面值的雙引號是在錯誤的地方。 –
當然,我知道這是正確的語法。但我如何與耶拿產生這種關係。我嘗試了一個自定義的'RDFDatatype',但它似乎沒有工作。因爲它總是生成一個'java:com.hp.hpl.jena.rdf.model.impl.LiteralImpl'數據類型。 –