我正在为包含数千个图表的数据集编写SPARQL查询,并且我想要动态计算哪些图表将包含在我的搜索中。举个例子,我可能只想包括今年我写的图。当查询很简单时,可以通过对图URI的限制来轻松完成此操作:
SELECT ?name WHERE {
GRAPH ?g { [ foaf:name ?name ] }
?g dc:creator ex:me ; dc:created ?date
FILTER( xsd:dateTime(?date) >= xsd:dateTime("2015-01-01") )
}
但是假设我的查询更复杂,我想要一对熟人列表。天真的实现是这样的:
SELECT ?name WHERE {
GRAPH ?g { ?name1 ^foaf:name/foaf:knows/foaf:name ?name2 }
?g dc:creator ex:me ; dc:created ?date
FILTER( xsd:dateTime(?date) >= xsd:dateTime("2015-01-01") )
}
如果所有三个FOAF三元组都在同一个图形中,则此方法可以正常工作。但是,如果任何图表位于不同的图表中,则会失败,因为?g
会绑定到每个结果中的单个图表。我可以在他们自己的GRAPH
块中明确地编写三个FOAF三元组中的每一个,但是我必须将每个三元组与它们自己的图形URI变量相关联,并对每个变量重复图形限制:
SELECT ?name WHERE {
GRAPH ?g1 { ?p1 foaf:name ?name1 }
?g1 dc:creator ex:me ; dc:created ?date1
FILTER( xsd:dateTime(?date1) >= xsd:dateTime("2015-01-01") )
GRAPH ?g2 { ?p1 foaf:knows ?p2 }
?g2 dc:creator ex:me ; dc:created ?date2
FILTER( xsd:dateTime(?date2) >= xsd:dateTime("2015-01-01") )
GRAPH ?g3 { ?p2 foaf:name ?name2 }
?g3 dc:creator ex:me ; dc:created ?date3
FILTER( xsd:dateTime(?date3) >= xsd:dateTime("2015-01-01") )
}
该代码现在可以做正确的事情,但随着查询变得更加复杂,它会迅速变得站不住脚。如果主查询具有 m 三元组并且图形限制具有 n ,则完整查询将以 m × n 三倍。
标准SPARQL 1.1中是否有更好的解决方案?我知道有些SPARQL引擎会从其URI中获取图形,然后您可以将该URI作为对SPARQL端点的GET请求的URL,但这不是标准的。我曾希望联邦查询机制可能会有所帮助,但似乎没有。
答案 0 :(得分:1)
由于我手边没有您的数据,我无法可靠地测试我的查询。但是,您似乎需要subqueries。
子查询是一种在其他查询中嵌入SPARQL查询的方法,通常用于实现无法实现的结果,例如限制查询中某些子表达式的结果数量。
在您的情况下,目标是:
ArrayList
由于您在查询后仅提及dc:creator
,因此您查询的结果并不清楚,因为它在查询的其余部分中无处可寻。以下是您可以尝试使用子查询的方法,也许可以找到灵感来解决您的问题:
?name