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 .
}
我有一个 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 .
}