使用org.openrdf.rio.trig.TriGWriter创建SPARQL更新

时间:2015-07-17 18:20:22

标签: scala sparql sesame

我正在使用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}");

1 个答案:

答案 0 :(得分:1)

TriGWriter真的不是为这种东西而设计的。它编写TriG文档,而不是SPARQL更新语句,虽然它们在表面上看起来很相似,但它们并不相同(正如您所知)。我认为你可能最好推出自己简单的RDFHandler实现,其中你真的只需要实现handleStatement

但是,如果你坚持使用TriGWriter,可以做的是创建一个TriGWriter的子类,在其中覆盖handleNamespace方法,使其成为一个简单的无操作。这样,编写器永远不会编写前缀映射,也永远不会使用前缀名称而不是IRI。