Java JENA:基于String对象创建单个语句

Java JENA:基于String对象创建单个语句,java,parsing,rdf,jena,Java,Parsing,Rdf,Jena,我必须解析N-TRIPLE内容,并对给定类型的每个文本应用修改 例如,我必须修改每个WKTLiteral,使它们使用引用。三元组,例如: "POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral> 我也尝试过使用RDFReader,但不知道如何使用RDFOutputStream。。。 要仅获取从字符串自动创建的语句对象,我必须创建一个模型,使用读取器和迭代器。在我看来,这似乎有些过分(我删掉了大部分测试,

我必须解析N-TRIPLE内容,并对给定类型的每个文本应用修改

例如,我必须修改每个WKTLiteral,使它们使用引用。三元组,例如:

"POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>
我也尝试过使用RDFReader,但不知道如何使用RDFOutputStream。。。 要仅获取从字符串自动创建的语句对象,我必须创建一个模型,使用读取器和迭代器。在我看来,这似乎有些过分(我删掉了大部分测试,比如测试是否有下一个语句…)

你知道一个更简单的方法来实现这一点吗


Arthur.

我不知道你是否能找到一个比你现在拥有的更好的方法,真的,除了你可能应该把文件分块阅读,而不是每一行。如果读入文件的块,则可以使用简单的构造SPARQL查询转换整个块。这将提供一个新模型,您可以将该模型的N-TRIPLE序列化附加到输出文件中(或将其插入到新的图形中,等等)。假设您有以下数据:

<urn:ex:a> <urn:ex:p> <urn:ex:b>.
<urn:ex:c> <urn:ex:q> "POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>.
。
"点(0.0 0 0.0)"。
这样的查询将生成以下更新的模型:

构造{s?p?oo}
在哪里{
#--为可读性而拉出的常量值;此
#--当然,这是可选的。
值(?dt?前缀){
(
" ") 
}
#--抓住每一个三元组,如果没有,将?oo绑定到?o
#--需要更新,或者更新为新的文本(如果需要)。
?s?p?o。
绑定(如果(isLiteral(?o)&数据类型(?o)=?dt,
strdt(concat(?前缀,str(?o)),?dt),
?o)
as?oo)
}
。
"点(0.0 0 0.0)"。

如果要将整个数据集加载到TDB实例中,您可以使用此实例的一些变体相对轻松地转换整个数据集,然后将最终数据转储到新文件中。

我不知道您是否能找到比现有数据更好的方法,真的,除了您可能应该读取文件的块,而不是每一行。如果读入文件的块,则可以使用简单的构造SPARQL查询转换整个块。这将提供一个新模型,您可以将该模型的N-TRIPLE序列化附加到输出文件中(或将其插入到新的图形中,等等)。假设您有以下数据:

<urn:ex:a> <urn:ex:p> <urn:ex:b>.
<urn:ex:c> <urn:ex:q> "POINT (0.0 0.0)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>.
。
"点(0.0 0 0.0)"。
这样的查询将生成以下更新的模型:

构造{s?p?oo}
在哪里{
#--为可读性而拉出的常量值;此
#--当然,这是可选的。
值(?dt?前缀){
(
" ") 
}
#--抓住每一个三元组,如果没有,将?oo绑定到?o
#--需要更新,或者更新为新的文本(如果需要)。
?s?p?o。
绑定(如果(isLiteral(?o)&数据类型(?o)=?dt,
strdt(concat(?前缀,str(?o)),?dt),
?o)
as?oo)
}
。
"点(0.0 0 0.0)"。
如果要将整个数据集加载到TDB实例中,则可以使用该实例的一些变体相对轻松地转换整个数据集,然后将最终数据转储到新文件中。

您会发现使用更有效。实例在遇到时发送。然后可以根据需要重写

Streams使用jena的SPI级别——节点、三元组和四元组,而不是语句、资源等——它们缺乏一些细节,但对于这样的任务,它们是理想的

考虑到你所写的,我怀疑写出固定的N-Triples是你想要的?这里有一个例子可以做到这一点。它所做的只是1)创建一个流来输出三元组,2)创建一个流来等待三元组,纠正对象(如果需要),并写入结果,3)开始整个解析过程:

final String wkt = "http://www.opengis.net/ont/geosparql#wktLiteral";

// Stream result to stdout
final StreamRDF outputHandler = StreamRDFLib.writer(System.out);

StreamRDF inputHandler = new StreamRDFBase() {
    @Override
    public void triple(Triple triple) { // Got a triple
        Node object = triple.getObject();

        Node transformed;
        // if object is literal and has wkt type
        if (object.isLiteral() &&
                wkt.equals(object.getLiteralDatatypeURI())) {
            // Make a new node, suitably modified
            transformed = NodeFactory.createLiteral(
                    "<http://www.opengis.net/def/crs/EPSG/0/4326> " 
                            + object.getLiteralLexicalForm(), 
                    object.getLiteralDatatype());
        } else { // Do nothing
            transformed = object;
        }

        // Write out with corrected object
        outputHandler.triple(
                Triple.create( triple.getSubject(), triple.getPredicate(),
                        transformed
                        ));
    }
};

// Parse 
RDFDataMgr.parse(inputHandler, RDFDataMgr.open("file"));
最终字符串wkt=”http://www.opengis.net/ont/geosparql#wktLiteral";
//将结果流到标准输出
最终流RDF outputHandler=StreamRDFLib.writer(System.out);
StreamRDF inputHandler=新StreamRDFBase(){
@凌驾
公共无效三元组(三元组){//得到一个三元组
节点对象=triple.getObject();
节点转换;
//如果对象是文本且具有wkt类型
if(object.isLiteral()&&
wkt.equals(object.getLiteralDatatypeURI())){
//创建一个新节点,并进行适当修改
transformed=NodeFactory.createLiteral(
" " 
+object.GetLiteralExicalForm(),
getLiteralDatatype());
}否则{//什么也不做
转换=对象;
}
//用正确的对象写出
三重输出(
Triple.create(Triple.getSubject(),Triple.getPredicate(),
转化
));
}
};
//解析
parse(在authandler中,RDFDataMgr.open(“文件”);
您会发现使用更有效。实例在遇到时发送。然后可以根据需要重写

Streams使用jena的SPI级别——节点、三元组和四元组,而不是语句、资源等——它们缺乏一些细节,但对于这样的任务,它们是理想的

考虑到你所写的,我怀疑写出固定的N-Triples是你想要的?这里有一个例子可以做到这一点。它所做的只是1)创建一个流来输出三元组,2)创建一个流来等待三元组,纠正对象(如果需要),并写入结果,3)开始整个解析过程:

final String wkt = "http://www.opengis.net/ont/geosparql#wktLiteral";

// Stream result to stdout
final StreamRDF outputHandler = StreamRDFLib.writer(System.out);

StreamRDF inputHandler = new StreamRDFBase() {
    @Override
    public void triple(Triple triple) { // Got a triple
        Node object = triple.getObject();

        Node transformed;
        // if object is literal and has wkt type
        if (object.isLiteral() &&
                wkt.equals(object.getLiteralDatatypeURI())) {
            // Make a new node, suitably modified
            transformed = NodeFactory.createLiteral(
                    "<http://www.opengis.net/def/crs/EPSG/0/4326> " 
                            + object.getLiteralLexicalForm(), 
                    object.getLiteralDatatype());
        } else { // Do nothing
            transformed = object;
        }

        // Write out with corrected object
        outputHandler.triple(
                Triple.create( triple.getSubject(), triple.getPredicate(),
                        transformed
                        ));
    }
};

// Parse 
RDFDataMgr.parse(inputHandler, RDFDataMgr.open("file"));
最终字符串wkt=”http://www.opengis.net/ont/geosparql#wktLiteral";
//将结果流到标准输出
最终流RDF outputHandler=StreamRDFLib.writer(System.out);
StreamRDF inputHandler=新StreamRDFBase(){
@凌驾
公共无效三元组(三元组){//得到一个三元组
节点对象=triple.getObject();
节点转换;
//如果对象是文本且具有wkt类型
if(object.isLiteral()&&