我尝试了以下查询,发现它在 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 中,可选部分被跳过,所以我没有得到任何结果。
我无法解释为什么这种行为不一致,因为我无法代表实现,但我也不感到惊讶。查询有点过于复杂;当
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) .
}