sparql - DELETE/INSERT 操作可用于删除包含空白节点的三元组 : how?

标签 sparql rdf jena fuseki blank-nodes

我想使用 SPARQL DELETE/INSERT确保重复更新后 ?performance 和某些连接的空白节点不会有多个属性值,而只有零(对于可选情况)或一(对于强制情况)。

如果我将 DELETE/INSERT(见下文)发送到 Jena Fuseki 1.1.1 服务器,我会收到以下错误消息:“DELETE 模板中不允许使用空白节点”。

但是,规范中包含这样一句话:“DELETE/INSERT 操作可用于删除包含空白节点的三元组。”

那么在这种情况下执行此操作的 DELETE/INSERT 的有效形式是什么?为了简化维护,如果 DELETE 和 INSERT 部分能够保持结构相似就好了。 (这是一个 follow-up 问题。)

DELETE {
    ?performance
        mo:performer ?_ ;
        mo:singer    ?_ ;
        mo:performance_of [  ### error marked here ###
            dc:title ?_ ;
            mo:composed_in [ a mo:Composition ;
                mo:composer ?_
            ]
        ]
}
INSERT {
    ?performance
        mo:performer ?performer ;     # optional
        mo:singer    ?singer ;        # optional
        mo:performance_of [
            dc:title ?title ;         # mandatory
            mo:composed_in [ a mo:Composition ;
                mo:composer ?composer # optional
            ]
        ]
 }
 WHERE {}

最佳答案

您需要 WHERE 部分中的内容。这将找到 bnode,将它们放入变量中,然后使用 DELETE 删除它们。 DELETE{} 本身并不是要匹配的模式 - 图形模式是 WHERE {} 部分。

类似于:

DELETE{
     ?performance
         mo:performance_of ?X .
     ?X dc:title ?title ;
         mo:composed_in ?Y .
     ?Y a mo:Composition .
     ?Y mo:composer ?composer .
     ?performance  mo:performer ?performer ;
                   mo:singer   ?singer
}
WHERE {
    ?performance
         mo:performance_of ?X .
     ?X dc:title ?title ;
         mo:composed_in ?Y .
     ?Y a mo:Composition .
     OPTIONAL { ?Y mo:composer ?composer }
     OPTIONAL { 
           ?performance  mo:performer ?performer ;
                         mo:singer    ?singer 
     }
}

让 DELETE{} 和 INSERT{} 相同是没有意义的 - 它实际上是一个空操作。

如果变量 in bout 绑定(bind)在 WHERE{} 部分的特定行中,则删除操作只会跳过该三元组,而不是实例化模板的其余部分。

对于人类来说,将 SPARQL 更新分为几个部分可能会更清楚。一个HTTP请求可以有多个操作,操作之间用“;”分隔:

DELETE{} WHERE {} ;
DELETE{} WHERE {} ;
INSERT DATA{}

关于sparql - DELETE/INSERT 操作可用于删除包含空白节点的三元组 : how?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27751946/

相关文章:

OWL/RDF 中的命名空间等效和弃用

java - 序列化 JENA OntModel 更改

rdf - 快速启动语义网的最佳 rdf 数据库

sparql - 查询DBpedia 人类发展指数国家

java - 从非结构化文本离线生成 RDF

专门用于汽车的 rdfa 命名空间

java - 使用 Jena 在 DBpedia 上创建 SPARQL 查询

java - 在耶拿读 N-Quads

rdf - 用于教育目的的最简单的 SPARQL 实现?

xml - 通过 SPARQL 使用 R XML 编码问题