取决于参数类型的请求的一部分(如果 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) .}
也就是说,如果?z
的rdfs: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) .
}
我正在 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) .}
也就是说,如果?z
的rdfs: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) .
}