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

Dru*_*rux 3 rdf sparql jena fuseki blank-nodes

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

如果我将DELETE/INSERT(见下文)发送到Jena Fuseki 1.1.1服务器,我收到此错误消息:"DELETE模板中不允许空白节点".

但是,规范包含以下句子:"DELETE/INSERT操作可用于删除包含空白节点的三元组."

那么在这种情况下,DELETE/INSERT的有效形式是什么呢?为了便于维护,如果DELETE和INSERT部件在结构上保持相似,那将是一件好事.(这是一个后续问题.)

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 {}
Run Code Online (Sandbox Code Playgroud)

And*_*dyS 5

你需要WHERE部分的东西.这将找到bnodes,将它们放在变量中,并使用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 
     }
}
Run Code Online (Sandbox Code Playgroud)

没有必要使DELETE {}和INSERT {}相同 - 它实际上是一个无操作.

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

对于人类来说,可以更清楚地在几个部分编写SPARQL更新.一个HTTP请求可以有多个操作,用";"分隔:

DELETE{} WHERE {} ;
DELETE{} WHERE {} ;
INSERT DATA{}
Run Code Online (Sandbox Code Playgroud)