在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 .
}
最佳答案
有几种方法可以做到这一点。最简单的纯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实现),并且可能是最好的读写方式。
关于rdf - 在SPARQL模式中选择多个值作为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17599658/