SPARQL,将逗号分隔的参数分成多个查询对象

时间:2015-07-16 09:52:47

标签: rdf sparql virtuoso

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

2 个答案:

答案 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))