我刚开始使用SPARQL,并且我正在尝试创建一个查询来检索id具有多个预定义值之一的所有信息?我有这样的事情:
SELECT *
WHERE {
?id ?property ?value .
?value a ?type .
?type rdfs:label ?type_value .
FILTER ( ?id IN (<id1>,<idi>,<idn> ) )
}
我遇到的问题是当id列表变得越来越大时,查询变得非常慢。我直觉地认为有一种更好的方法来编写这个查询,但我无法弄清楚如何创建这种查询。我正在考虑这样的事情:
SELECT *
WHERE {
<id_value> ?property ?value .
?value a ?type .
?type rdfs:label ?type_value .
}
它仅检索多个id的所有值,最后消除了对结果的过滤,但我无法弄清楚如何编写查询以便返回id_value的所有值。当我为另一个id_value添加另一行时,它会过滤掉我期望的其他值,所以我认为我写得不正确。我怎么能这样做?
答案 0 :(得分:4)
使用values
,您可以写:
SELECT * WHERE {
values ?id { <id1> <idi> <idn> }
?id ?property ?value .
?value a ?type .
?type rdfs:label ?type_value .
}
SPARQL 1.1说的是values
:
数据可以直接以图形模式书写或添加到查询中 使用VALUES。 VALUES提供内联数据作为解决方案序列 通过连接操作与查询评估的结果相结合。 应用程序可以使用它来提供特定要求 查询结果以及SPARQL查询引擎的实现 通过SERVICE关键字提供联合查询以发送更多信息 约束查询到远程查询服务。
其中一个例子实际上非常接近你已经得到的东西:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <http://example.org/book/>
PREFIX ns: <http://example.org/ns#>
SELECT ?book ?title ?price
{
VALUES ?book { :book1 :book3 }
?book dc:title ?title ;
ns:price ?price .
}
答案 1 :(得分:2)
尝试使用VALUES
子句,如下所示:
SELECT *
WHERE {
VALUES ?id { ...list of ids... }
?id ?property ?value .
?value a ?type .
?type rdfs:label ?type_value .
}
使用FILTER
方法可能会更有效率。