在SPARQL模式中选择多个值作为对象

时间:2013-07-11 17:22:30

标签: rdf sparql semantic-web

在SPARQL中我们可以做这样的事情

select * where {
    ?s   (_:prop1 | _:prop2)  "some_val" .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}

是否可以对模式的对象部分执行相同操作?如果不可能的话,有哪些解决方法呢?

例如:

select * where {
    ?s   _:prop ("v1" | "v2") .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}

2 个答案:

答案 0 :(得分:22)

有几种方法可以做到这一点。最简单和纯粹的SPARQL 1.0方法是使用UNION例如

SELECT * WHERE
{
  { ?s _:prop "v1" } UNION { ?s _:prop "v2" }

  # Use ?s in other patterns
}

这可能是最简单的方法,但如果您需要?s上的多个约束,这很快就会变得难以处理。

第二种方法是在IN子句中使用FILTER函数,这需要SPARQL 1.1实现,例如。

SELECT * WHERE
{
  ?s _:prop ?value .
  FILTER(?value IN ("v1", "v2"))

  # Use ?s in other patterns
}

问题在于,如果您有许多替代方案或许多可能与IN

匹配的数据,那么使用?s _:prop ?value的效果会非常差

第三种方法是使用VALUES子句,它再次需要SPARQL 1.1实现:

SELECT * WHERE
{
  VALUES (?value) { ( "v1" ) ( "v2 " ) }
  ?s _:prop ?value .

  # Use ?s in other patterns
}

这可能是最好的选择,因为它可以更好地扩展到许多替代方案(取决于您的SPARQL实现),并且可能是最好的读写方式。

答案 1 :(得分:4)

这很有效:

SELECT *
WHERE
{
    VALUES ?value
    {
       "value1"
       "value2"
       "etc"
    }

    ?s ?p ?value
}