【问题标题】:Jena UpdateFactory耶拿更新工厂
【发布时间】:2012-04-02 16:16:24
【问题描述】:

我想知道是否可以使用 ARQ Op 对象在 Jena 中创建 SPARQL UpdateRequest。我有兴趣以编程方式创建这样的更新:

DELETE {?s :predicate <http://example.org#old> }    
INSERT {?s :predicate <http://example.org#toAdd>} 
WHERE  {?s :predicate <http://example.org#old> } 

通过在 ARQ API 的 DELETE、INSERT 和 WHERE 子句中创建模式。 到目前为止,我发现创建 SPARQL 更新请求的唯一方法需要解析 SPARQL 字符串或创建 com.hp.hpl.jena.update.Update 对象(它使用 QuadAcc 对象,我找不到使用示例。

我担心 SPARQL UPDATE 请求的管理和 SPARQL SELECT 查询之一是分开的,并且 ARQ 不能用于动态“组装”查询。

提前致谢

【问题讨论】:

    标签: jena arq


    【解决方案1】:

    这个问题也让我很头疼。我想从ElementGroup 对象和ElementTriplesBlock 对象组成一个UpdateRequest。这是用于构造查询的两个主要类。例如:

    ElementGroup queryPattern = ...
    ElementTriplesBlock constructTriples = ...
    
    Query query = new Query();
    query.setQueryConstructType();
    
    // set CONSTRUCT clause
    query.setConstructTemplate(new Template(constructTriples.getPattern()));
    
    // set WHERE clause
    query.setQueryPattern(queryPattern);
    

    我尝试了 Jena 邮件列表并收到了这个答案:

    更新 API 旨在处理任意大的流 无限的 INSERT 和 DELETE 数据,因此使用 QuadAcc 而不是 更新的插入/删除部分的元素。

    最终我使用ParametrizedSparqlString 实现了这一点:

    ElementGroup queryPattern = ...
    ElementTriplesBlock deleteTriples = ...
    ElementTriplesBlock insertTriples = ...
    
    ParameterizedSparqlString qstring = new ParameterizedSparqlString();
    
    // Set DELETE clause
    qstring.append("DELETE {");
    qstring.append(deleteTriples.toString());
    qstring.append("}");
    
    // Set INSERT clause
    qstring.append("INSERT {");
    qstring.append(insertTriples.toString());
    qstring.append("}");
    
    // Set WHERE clause
    qstring.append("WHERE {");
    qstring.append(queryPattern.toString());
    qstring.append("}");
    
    // Construct an update query
    UpdateRequest request = qstring.asUpdate();
    

    【讨论】:

      【解决方案2】:

      我自己没有尝试过,但看起来创建Update 对象并将它们组装成UpdateRequest 确实是要走的路。

      看了一眼,QuadAcc 似乎不是特别难,只需将addTriple() 与包含变量的三元组一起使用即可。

      Update 的 UpdateModify 子类看起来特别有趣,它对应于您示例中的 DELETE … INSERT … WHERE 模式。不幸的是,WHERE 子句是用Element(查询部分的语法表示)而不是Op(代数表示)初始化的。

      【讨论】:

      • 您好,感谢您的回答。困扰我的问题是,UPDATE 对象的定义是否与 SELECT 如此不同以至于无法找到来自 ARQ 操作的桥?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      相关资源
      最近更新 更多