带有可选部分的 SPARQL 更新

SPARQL update with optional parts

考虑以下 SPARQL 更新:

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 {}

如果我不提供值(例如在耶拿的 ParameterizedSparqlString.setIri()?performer?singer?composer,此更新将不会插入具有相应值的语句对象,这是预期的。

但是,如果 ?composer 丢失,我该如何抑制 [] a mo:Composition。在第二个 INSERT 中创建它,其 WHERE 过滤器 ISIRI(?composer) 似乎不是一个选项,因为该 INSERT 不知道第一个已经创建的空白节点。

那么如何在单个 SPARQL 更新中支持这种可选参数呢?例如,"storing" 两个 INSERT 之间的空白节点有什么方法吗?

当调用者将 composition 设置为空白节点时,当且仅当它设置 ?composer 为 IRI 时,以下内容似乎有效。

if (composer != null) {
    parameterizedSparqlString.setIri  ("composer"   , composer);
    parameterizedSparqlString.setParam("composition", NodeFactory.createAnon());
}

INSERT {
    ?performance
        mo:performer ?performer ; # optional
        mo:singer    ?singer ;    # optional
        mo:performance_of [
            dc:title ?title ;               # mandatory
            mo:composed_in ?composition ] . # optional
    ?composition a mo:Composition ;
        mo:composer ?composer .
}
WHERE {}

向@Joshua Taylor 致敬。

如果可能的话,我仍然更喜欢不需要额外参数 ?composition 的独立版本(即无需对调用者提出额外要求即可工作)。