是否可以在没有迭代的情况下在 SPARQL中实现空白节点 skolemization ?在我看来,需要迭代来计算空白节点链,例如:
@prefix : <http://example.com/> .
[ a :A ;
:p1 [
a :B
]
] .
用于 skolemization 的 SPARQL 更新操作可以从仅在没有空白节点对象的三元组中作为主题出现的空白节点开始:
DELETE {
?b1 ?outP ?outO .
?inS ?inP ?b1 .
}
INSERT {
?iri ?outP ?outO .
?inS ?inP ?iri .
}
WHERE {
{
SELECT ?b1 (uuid() AS ?iri)
WHERE {
{
SELECT DISTINCT ?b1
WHERE {
?b1 ?p1 [] .
FILTER isBlank(?b1)
FILTER NOT EXISTS {
?b1 ?p2 ?b2 .
FILTER isBlank(?b2)
}
}
}
}
}
?b1 ?outP ?outO .
OPTIONAL {
?inS ?inP ?b1 .
}
}
可以重复此操作,直到在数据中找不到空白节点:
ASK {
?bnode ?p [] .
FILTER isBlank(?bnode)
}
是否可以在单个 SPARQL 更新操作中避免迭代并实现空白节点 skolemization?
(此外,此方法假定没有“孤立”空白节点(即仅作为对象出现的空白节点)。)