0xF*_*xFF 15 rdf semantic-web sparql
在SPARQL中我们可以做这样的事情
select * where {
?s (_:prop1 | _:prop2) "some_val" .
...
#use ?s in other patterns
?s ?o ?p .
}
Run Code Online (Sandbox Code Playgroud)
是否可以对模式的对象部分执行相同的操作?如果不可能的话,有哪些解决方法呢?
例如:
select * where {
?s _:prop ("v1" | "v2") .
...
#use ?s in other patterns
?s ?o ?p .
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*obV 22
有几种方法可以做到这一点.最简单和纯粹的SPARQL 1.0方法是使用UNION例如
SELECT * WHERE
{
{ ?s _:prop "v1" } UNION { ?s _:prop "v2" }
# Use ?s in other patterns
}
Run Code Online (Sandbox Code Playgroud)
这可能是最简单的方法,但如果你需要多个约束,?s很快就会变得难以处理.
第二种方法是IN在FILTER子句中使用函数,这需要SPARQL 1.1实现,例如
SELECT * WHERE
{
?s _:prop ?value .
FILTER(?value IN ("v1", "v2"))
# Use ?s in other patterns
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,IN如果您有许多替代方案或可能匹配的大量数据,那么使用可能会表现得非常糟糕?s _:prop ?value
第三种方法是使用VALUES再次需要SPARQL 1.1实现的子句:
SELECT * WHERE
{
VALUES (?value) { ( "v1" ) ( "v2 " ) }
?s _:prop ?value .
# Use ?s in other patterns
}
Run Code Online (Sandbox Code Playgroud)
这可能是最好的选择,因为它可以更好地扩展到许多替代方案(取决于您的SPARQL实现),并且可能是最好的读写.
这效果很好:
SELECT *
WHERE
{
VALUES ?value
{
"value1"
"value2"
"etc"
}
?s ?p ?value
}
Run Code Online (Sandbox Code Playgroud)