Jena自定义数据类型

时间:2014-05-12 14:46:13

标签: java apache sparql jena semantic-web

对于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中定义了一个自定义数据类型?

2 个答案:

答案 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)" .

因此正是我想要的......感谢所有的输入。