1

考虑以下 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 {}

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

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

那么如何在单个 SPARQL 更新中支持这种可选参数呢?例如,有没有办法在两个 INSERT 之间“存储”空白节点?

4

1 回答 1

1

composition当且仅当调用者设置为?composerIRI时,以下似乎有效。

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(即无需对调用者提出额外要求即可工作)。

于 2015-01-02T16:25:47.940 回答