Java JENA:基于String对象创建单个语句
我必须解析N-TRIPLE内容,并对给定类型的每个文本应用修改 例如,我必须修改每个WKTLiteral,使它们使用引用。三元组,例如: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。。。 要仅获取从字符串自动创建的语句对象,我必须创建一个模型,使用读取器和迭代器。在我看来,这似乎有些过分(我删掉了大部分测试,
"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()&&