我有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> .
}
答案 0 :(得分:2)
SPARQL没有表达式的循环,也没有变量的序列值。 您可以在创建查询字符串时使用格式化或使用字符串操作。
SELECT * WHERE
{
?person ?p ?o .
FILTER STRSTARTS(str(?o), "http://localhost:8080/drinks/")
}
如果您想要计算&#34; http://localhost:8080/drinks/&#34;请参阅REPLACE
等。在查询中。
答案 1 :(得分:1)
AndyS的答案是正确的,没有方便的方法可以做到这一点,但是如果你真的必须使用你所拥有的IRI,那么有一些选择。使用正则表达式,您可以将您拥有的IRI字符串分解为包含所需三个IRI的IRI字符串的字符串:
select ?url ?urls where {
values ?url { <http://localhost:8080/drinks/coke,pepsi,fanta> }
bind(replace(str(?url), "(^.*/).*$","$1") 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" |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
使用此方法,您可以执行一个查询,其中您可以根据其strig是否存在于较大的字符串中来过滤IRI。这显然有一些潜在的积极因素,因为任何子字符串也会注册。您可以使用以下内容进行过滤:
?s ?p ?o .
filter contains(?urls,str(?s))