2014-05-12 88 views
0

對於GeoSPARQL測試項目,我想要在Jena中設置自定義數據類型。當我通過在Jena網站上提供的the example嘗試此操作時,它仍然無法正常工作。我得到以下結果:Jena自定義數據類型

_: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.LiteralImplhttp://www.opengis.net/ont/sf#wktLiteral因爲我婉與GeoSPARQL工作。在this page他們有與我的三重商店和空間索引完美配合的示例數據。但是,上述數據根本不適用於空間索引。

所以,我的問題是,我在我的RDF中在耶拿定義了一個自定義數據類型?

回答

0

我只是找到了答案,我的問題了很多的試驗和錯誤之後。要自定義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)" . 

從而正是我想要的......感謝所有的輸入。

2

語法

"POINT (52.83525867111958 6.870789811954563)"^^<http://www.opengis.net/ont/sf#wktLiteral> 
+0

所以,只是爲了讓它顯得非常明顯:在問題中,字面值的雙引號是在錯誤的地方。 –

+0

當然,我知道這是正確的語法。但我如何與耶拿產生這種關係。我嘗試了一個自定義的'RDFDatatype',但它似乎沒有工作。因爲它總是生成一個'java:com.hp.hpl.jena.rdf.model.impl.LiteralImpl'數據類型。 –