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

时间:2018-01-24 15:51:48

标签: r sparql

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

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

我的请求是一般化的,价值会根据您的选择而变化。

根据我上面的例子,variable1= dbo:birthplacevariable1=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); } } }

1 个答案:

答案 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) .
}