IRI (SPARQL) 中的斜杠

Slash in IRI (SPARQL)

我有一个 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 错误的情况下查询这些名称?

Example triple

:name/name1 :hasCity :City.

I've tried the query:

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

This gives me all names even if they don't have a /

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

尝试以下操作:

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

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

大多数 "typical" IRI 中已经至少有两个斜线(例如,在 http:// 中),但并非所有 IRI 都是这样(例如, urn:ex:foo), 所以不会有通用的方法来做到这一点。但是,如果您主要使用 "typical" 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> |
----------------------------

您可以使用反斜杠对斜杠进行转义,例如:

PREFIX mdb: <http://example.org/movieDB/>
PREFIX country: <http://example.org/movieDB/country/>
BASE <http://example.org/movieDB/>
construct {
    ?s ?p ?o
} 
where {
    ?s ?p ?o .
    ?s mdb:country mdb:country\/France .
}