在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 }
这可能是最简单的方法,但如果您需要多个约束,这可能会很快变得难以捉摸.
第二种方法是在FILTER子句中使用IN函数,这需要一个SPARQL 1.1实现.
SELECT * WHERE { ?s _:prop ?value . FILTER(?value IN ("v1","v2")) # Use ?s in other patterns }
这里的问题是,如果您有很多备选方案或大量可能匹配的数据,那么使用IN可以执行得很差?
第三种方法是使用VALUES子句,它再次需要一个SPARQL 1.1实现:
SELECT * WHERE { VALUES (?value) { ( "v1" ) ( "v2 " ) } ?s _:prop ?value . # Use ?s in other patterns }
这可能是最好的选择,因为它可以更好地扩展到许多替代方案(取决于您的SPARQL实现),也许是最好的阅读和写作.