带可选部件的SPARQL更新

时间:2015-01-02 14:51:56

标签: sparql rdf jena blank-nodes

考虑以下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中,此更新不会提供具有相应对象的语句,这是预期的。

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

那么我如何在单个SPARQL更新中支持这种可选参数?例如,有没有任何方法可以存储"两个INSERT之间的空白节点?

1 个答案:

答案 0 :(得分:1)

以下似乎有效,当调用者将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的自包含版本(即无需对来电者提出额外要求),如果可能的话。<\ n> / p>