SPARQL,逗号分隔参数到多个查询对象
SPARQL, Comma separated parameter into multiple query objects
我有 IRI
http://localhost:8080/drinks/coke,pepsi,fanta
这是自动生成的,我想在以下对象中重新格式化它,这样我会得到一个如下所示的查询
SELECT * WHERE
{
?person ?p <http://localhost:8080/drinks/coke> .
?person ?p <http://localhost:8080/drinks/pepsi> .
?person ?p <http://localhost:8080/drinks/fanta> .
}
SPARQL 没有表达式循环,也没有变量序列值。
您可以在创建查询字符串或使用字符串操作时进行格式化。
SELECT * WHERE
{
?person ?p ?o .
FILTER STRSTARTS(str(?o), "http://localhost:8080/drinks/")
}
如果您想在查询中计算“http://localhost:8080/drinks/”,另请参阅 REPLACE
等。
AndyS 的回答是正确的,没有方便的方法来做到这一点,但如果您真的 必须像您现有的那样使用 IRI,则有一些选择。使用正则表达式,您可以将您拥有的 IRI 字符串分解为一个包含您想要的三个 IRI 的 IRI 字符串的字符串:
select ?url ?urls where {
values ?url { <http://localhost:8080/drinks/coke,pepsi,fanta> }
bind(replace(str(?url), "(^.*/).*$","") as ?prefix)
bind(concat(",",strafter(str(?url),?prefix)) as ?parts)
bind(replace(?parts,",",concat(" ",?prefix)) as ?urls)
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
| url | urls |
================================================================================================================================================================
| <http://localhost:8080/drinks/coke,pepsi,fanta> | " http://localhost:8080/drinks/coke http://localhost:8080/drinks/pepsi http://localhost:8080/drinks/fanta" |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
使用它,您可以执行查询,其中您可以根据 IRI 的字符串是否存在于较大的字符串中来过滤 IRI。这显然有一定的假阳性潜力,因为任何子字符串也会注册。您可以使用以下内容进行过滤:
?s ?p ?o .
filter contains(?urls,str(?s))
我有 IRI
http://localhost:8080/drinks/coke,pepsi,fanta
这是自动生成的,我想在以下对象中重新格式化它,这样我会得到一个如下所示的查询
SELECT * WHERE
{
?person ?p <http://localhost:8080/drinks/coke> .
?person ?p <http://localhost:8080/drinks/pepsi> .
?person ?p <http://localhost:8080/drinks/fanta> .
}
SPARQL 没有表达式循环,也没有变量序列值。 您可以在创建查询字符串或使用字符串操作时进行格式化。
SELECT * WHERE
{
?person ?p ?o .
FILTER STRSTARTS(str(?o), "http://localhost:8080/drinks/")
}
如果您想在查询中计算“http://localhost:8080/drinks/”,另请参阅 REPLACE
等。
AndyS 的回答是正确的,没有方便的方法来做到这一点,但如果您真的 必须像您现有的那样使用 IRI,则有一些选择。使用正则表达式,您可以将您拥有的 IRI 字符串分解为一个包含您想要的三个 IRI 的 IRI 字符串的字符串:
select ?url ?urls where {
values ?url { <http://localhost:8080/drinks/coke,pepsi,fanta> }
bind(replace(str(?url), "(^.*/).*$","") as ?prefix)
bind(concat(",",strafter(str(?url),?prefix)) as ?parts)
bind(replace(?parts,",",concat(" ",?prefix)) as ?urls)
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
| url | urls |
================================================================================================================================================================
| <http://localhost:8080/drinks/coke,pepsi,fanta> | " http://localhost:8080/drinks/coke http://localhost:8080/drinks/pepsi http://localhost:8080/drinks/fanta" |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
使用它,您可以执行查询,其中您可以根据 IRI 的字符串是否存在于较大的字符串中来过滤 IRI。这显然有一定的假阳性潜力,因为任何子字符串也会注册。您可以使用以下内容进行过滤:
?s ?p ?o .
filter contains(?urls,str(?s))