我正在使用org.openrdf.rio.trig.TriGWriter来创建SPARQL更新查询。我的查询需要采用以下格式:
PREFIX ....
PREFIX ....
insert data{
graph <....../id>{}
graph <....../id>{}
graph <....../id>{}
}
但我现在得到的是:
PREFIX ....
PREFIX ....
insert data{
graph <....../id>
@prefix ...
@prefix ...
{....}
graph <....../id>
@prefix ...
@prefix ...
{....}
graph <....../id>
@prefix ...
@prefix ...
{....}
}
前缀与TriGWriter.startRDF()和TriGWriter.endRDF()调用有关。我想压制@prefix的所有行。我希望有一种干净的方式可以做到这一点,一旦它们已经存在就不会让它们出来。我正在看TriGWriter.closeActiveContext()调用,但是我没有得到好的结果。任何帮助将不胜感激。
以下是生成我的sparql的代码:
def rdfWriter = new org.openrdf.rio.trig.TriGWriter(updateWriter);
rdfWriter.startRDF();
rdfWriter.handleNamespace("dc","http://purl.org/dc/terms/");
rdfWriter.handleNamespace("mrss","http://search.yahoo.com/mrss/");
rdfWriter.handleNamespace("xsd","http://www.w3.org/2001/XMLSchema#");
rdfWriter.handleNamespace("owl","http://www.w3.org/2002/07/owl#");
rdfWriter.handleNamespace("sesame","http://www.openrdf.org/schema/sesame#");
rdfWriter.endRDF();
updateWriter.getBuffer().setLength(resetLength);
it = map.entrySet().iterator();
while (it.hasNext())
{
Map.Entry pair = (Map.Entry)it.next();
rdfWriter.startRDF();
"""GRAPH <${camelContext.getRegistry().lookup('context')}content/${pair.getKey()}>""".writeTo(updateWriter);
def graph = pair.getValue();
graph.each{
rdfWriter.handleStatement(it);
}
rdfWriter.endRDF();
}
updateWriter.append("${lsp} }; ${lsp}");
答案 0 :(得分:1)
TriGWriter真的不是为这种东西而设计的。它编写TriG文档,而不是SPARQL更新语句,虽然它们在表面上看起来很相似,但它们并不相同(正如您所知)。我认为你可能最好推出自己简单的RDFHandler
实现,其中你真的只需要实现handleStatement
。
但是,如果你坚持使用TriGWriter,可以做的是创建一个TriGWriter的子类,在其中覆盖handleNamespace
方法,使其成为一个简单的无操作。这样,编写器永远不会编写前缀映射,也永远不会使用前缀名称而不是IRI。