【问题标题】:Using org.openrdf.rio.trig.TriGWriter to create a SPARQL update使用 org.openrdf.rio.trig.TriGWriter 创建 SPARQL 更新
【发布时间】:2015-07-17 18:20:22
【问题描述】:

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

【问题讨论】:

    标签: scala sparql sesame


    【解决方案1】:

    TriGWriter 真的不是为这种事情而设计的。它编写 TriG 文档,而不是 SPARQL 更新语句,虽然它们在语法上表面上相似,但它们并不相同(正如您所发现的那样)。我认为您最好推出自己的简单RDFHandler 实现,您实际上只需要实现handleStatement

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

    【讨论】:

    • 谢谢,非常感谢您的意见。我会尝试实现我自己的处理程序。
    • @user2917629 专业提示:创建 RDFHandlerBase 的子类。这样您就不必为每个方法提供实现,您只需覆盖您想要修改的那些。
    • 是的,当然。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多