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 等。

A​​ndyS 的回答是正确的,没有方便的方法来做到这一点,但如果您真的 必须像您现有的那样使用 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))