IRI中的斜线(SPARQL)

时间:2017-03-01 12:31:45

标签: sparql rdf semantic-web owl

我有一个在IRI中有斜线的IRI:

示例三重

:name/name1 :hasCity :City.

我想找到所有带斜杠的名字。

我已尝试过查询:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"/")}

这给了我所有的名字,即使他们没有/

我试过了:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"//")}

这也给了我所有名字,包括那些没有/

的名字

我试过了:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"\/")}

为此我得到错误:在'" \'

的短双引号字符串中的转义错误序列

是否有正确的方法来获得" /"仅在IRI前缀之后的部分?

后续问题:有没有办法在没有sparql抛出错误的情况下查询这些名称?

2 个答案:

答案 0 :(得分:2)

  

示例三重

:name/name1 :hasCity :City.
     

我已经尝试了查询:

select ?name {?name ?pred ?obj FILTER regex(str(?name),"/")}
     

即使他们没有/

,这也给了我所有的名字

这个答案几乎肯定是正确的,但这并不明显,因为你正在查看缩写名称。

尝试以下方法:

 select (str(?name) as ?fullname) {?name ?pred ?obj FILTER regex(str(?name),"/")}

这将确保正则表达式显示对象的名称。我的猜测是你的所有对象都有http://或类似的URI,它们显然会匹配。

答案 1 :(得分:1)

大多数"典型" IRI中已经至少有两个斜杠(例如,在 http:// 中),但并非所有IRI都是这样的(例如, urn:ex:foo )因此,这不是一种普遍的做法。但是,如果你主要使用"典型的" IRI,然后您可以使用在双斜线后查找斜杠的正则表达式,如" //.*/" 。例如:

select ?name {
  values ?name { <urn:ex:foo>             #-- no slash, but won't match
                 <http://example.org>     #-- no slash
                 <http://example.org/foo> #-- a slash
               }
  filter regex(str(?name), "//.*/")
}
 ----------------------------
| name                     |
============================
| <http://example.org/foo> |
----------------------------