带有 BIND 的 SPARQL 可选选项在 RDFlib 中不起作用

问题描述 投票:0回答:1

我尝试了以下查询,发现它在 rdf4j 中有效,但在 rdflib 中无效。在进行了一些暴力破解之后,我发现仅当 OPTIONAL 块中存在 BIND 时,查询才不会按预期运行。有什么解决办法吗?

PREFIX rdfs:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ex:<http://example.org#>


CONSTRUCT {
          
    ex:node1 rdfs:value ?testNode .

}
WHERE{
    ex:current_value rdfs:value ?value .
    
    OPTIONAL { 
    ex:current_value rdfs:value ?value .
    FILTER(?value = ex:test1) .
   
    BIND(BNODE() as ?testNode) .

    }
    OPTIONAL {
    ex:current_value rdfs:value ?value .
    FILTER(?value != ex:test1) .
    BIND(rdfs:nil as ?testNode) .        
    }
}

因此,从技术上讲,此查询应该生成一个值,其中

?testNode
rdfs:nil
或空白节点。 例如

http://example.org#node1  http://www.w3.org/1999/02/22-rdf-syntax-ns#value http://www.w3.org/1999/02/22-rdf-syntax-ns#nil

在 rdf4j 中,它的行为符合预期(产生

rdfs:nil
或空白节点,具体取决于
ex:test1
的值)。但是,在 rdflib 中,可选部分被跳过,所以我没有得到任何结果。

python sparql rdf semantic-web rdflib
1个回答
0
投票

我无法解释为什么这种行为不一致,因为我无法代表实现,但我也不感到惊讶。查询有点过于复杂;当

OPTIONAL
在两种情况下都左绑定并且您不做任何其他事情时,您不需要单独的
?testNode
模式(并且
ex:current_value rdfs:value ?value .
也有多余的):

PREFIX rdfs:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX ex:<http://example.org#>

CONSTRUCT {
    ex:node1 rdfs:value ?testNode .
}
WHERE{
    ex:current_value rdfs:value ?value .
    BIND((IF(?value = ex:test1), BNODE(), rdfs:nil) as ?testNode) .
}
© www.soinside.com 2019 - 2024. All rights reserved.