取决于参数类型的请求的一部分(如果 URI 与否)

Part of a request depending on parameter type (if URI or not)

我正在 SPARQL 中创建一个接口来查询 DBpedia。

例如,您可以搜索在巴黎出生的人或 1966 年出生的人。

我的要求是泛化的,数值根据你的选择而变化。

根据我上面的例子,这里variable1= dbo:birthplace或者variable1=dbo:birthDate

SELECT *
WHERE {
?x a dbo:Person .
?x variable1 ?z.
}

我加一行写你要的地方的名字:

SELECT *
WHERE {
?x a dbo:Person .
?x variable1 ?z.
?z rdfs:label variable2.
}

但这只有在 ?z 是一个 URI 时才有效,日期不是这种情况。

有人知道使这两种情况有效的方法吗?

我试图添加一个 if 声明:

如果 ?z 是 URI,添加行 ?z rdfs:label variable2.
否则检查 ?z = variable2

但似乎 if 语句仅适用于创建新参数,在此示例中为 ?type

BIND (IF(isURI(?z),"URI","Not")AS ?type).  

虽然我想要这样的东西:

BIND (IF(isURI(?z),?z rdfs:label ?nameobject,?nameobject)AS ?nameobject).  

抱歉,如果我的问题没有被正确地问到,我已经尽力把问题说清楚了..

编辑:使用 OPTIONAL,感谢 Stanislav Kralin

我试过 optional,这是我的代码:

SELECT distinct *
             WHERE {
?x a dbo:Person .
?x rdfs:label ?name .
?x dbp:birthName ?z .
OPTIONAL{ ?z rdfs:label ?nameobject .} 
OPTIONAL{BIND(?z as ?nameobject) .} 
BIND (concat("http://wikipedia.org/wiki/",replace(?name," ","_")) as ?wikilink) .
}
            LIMIT 100

所以如果 ?z 是一个 URI,它给出 rdfs:label;如果不是(即键入文字或带有语言标签的纯文字),它应该保留 ?z

它执行第一个 optional 但不执行第二个。但是如果我写这个

OPTIONAL{BIND("Try" as ?nameobject) .} 

它写入 "Try" 语句。所以我认为我离解决方案不远,也许我没有正确编写 BIND.

终于有了解决办法! :)

这是我的代码的开头:

SELECT distinct *
WHERE {
?x a dbo:Activity .
?x rdfs:label ?name .
?x dbp:skills ?z .
}

ORDER BY?x
LIMIT 100 

我的问题是我需要根据 ?z 变量的数据类型进行 2 个不同的查询。

我试着用 IF 来做,但是正如 here 所解释的那样,在 SPARQL 中 IF 是一个运算符而不是一个语句。

所以我尝试使用 OPTIONAL 说:

OPTIONAL{ ?z rdfs:label ?nameobject .} 
OPTIONAL{BIND( ?z as ?nameobject) .}

也就是说,如果?zrdfs:label存在,则将其放入?nameobject,否则,将?z放入?nameobject

但这并没有奏效,可能是因为变量类型不同。

最后我的解决方案是创建2列,将数据放在同一类型中,然后将它们放在同一列中:

SELECT distinct *
WHERE {
?x a dbo:Activity .
?x rdfs:label ?name .
?x dbp:skills ?z .
OPTIONAL{ ?z rdfs:label ?nameobjectURI .} 
BIND( IF(isURI(?z),"",concat(?z," ")) as ?nameobjectOTH) . 
BIND( IF(bound(?nameobjectURI),STR(?nameobjectURI),?nameobjectOTH) as ?nameobject) . 
}          
ORDER BY?x
LIMIT 100 

这很有效!我希望它能帮助别人 :)

使用 COALESCE 解决方案进行编辑,来自 Stanislav Kralin

可以像这样简化代码:

SELECT distinct *
             WHERE {
?x a dbo:Activity .
?x rdfs:label ?name .
BIND(STR(?name) as ?namestr) .
?x dbp:skills ?z .
OPTIONAL{ ?z rdfs:label ?nameobjectURI .} 
BIND (COALESCE(STR(?nameobjectURI),concat(?z," ")) as ?nameobject) .
}