我想使用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 {}
答案 0 :(得分: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
}
}
没有必要使DELETE {}和INSERT {}相同 - 它实际上是无操作。
如果bout中的变量绑定在WHERE {}部分的特定行中,则删除只会跳过该三元组,而不是实例化模板的其余部分。
对于人类来说,在几个部分中编写SPARQL更新可能更清楚。一个HTTP请求可以有多个操作,由";":
分隔DELETE{} WHERE {} ;
DELETE{} WHERE {} ;
INSERT DATA{}