SPARQL if-then-else statement



我正在尝试创建一个RDF图,其中:如果存在?n1,则将创建形式为<?x ex:n "1">的三元组。否则,将创建形式为<?x ex:n "0">的三元组。我的代码如下:

CONSTRUCT {?x ex:n ?result .}
WHERE { 
?x ex:n ?n1 .
BIND (IF(?n1 ="    *"^^xsd:string, "0", "1") AS ?result)
}

然而,仅创建存在?n1的值的三元组(<?x ex:n "1">(。我怀念形式中的三元组:<?x ex:n "0">。为什么会发生这种情况?

" *"^^xsd:string不会检查您的字符串是否为空。相反,它的字面意思是";四个空格后面跟着一个星号";。

为了检查字符串是否与模式匹配,应该使用SPARQLREGEX函数。因此,您可能想要使用REGEX(?n1, "^ *$"),其中^$分别匹配模式的开始和结束,*是零或更多的量词。

CONSTRUCT { ?x ex:n ?result . }
WHERE { 
?x ex:n ?n1 .
BIND (IF(REGEX(?n1, "^ *$"), "0", "1") AS ?result)
}

编辑:如果您还想检索?x的值,其中您没有<?x ex:n ?n1>,但您有<?id ex:p ?x>,您可以执行以下操作:

CONSTRUCT { ?x ex:n ?result . }
WHERE { 
{ ?id ex:p ?x . } UNION { ?x ex:n ?n1 . }
BIND (IF(!BOUND(?n1) || REGEX(?n1, "^ *$"), "0", "1") AS ?result)
}

最新更新