我在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) .}
。但是,如果我写这个
BIND
它写了“Try”语句。所以我认为我离解决方案并不远,也许我没有正确地写出public static void main(String[] args) {
String text = "hello I am here, how are you?";
String[] separated = text.split(" ");//separates by spaces
for (String word : separated) {
if (!word.trim().isEmpty()) {
System.out.println(word);
}
}
}
。
答案 0 :(得分:1)
最后,这是解决方案! :)
这是我的代码的开头:
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) .}
这意味着,如果rdfs:label
存在?z
,请将其放在?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) .
}