图形限制以减少SPARQL中的数据集

时间:2015-08-20 01:17:37

标签: sparql

我正在为包含数千个图表的数据集编写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,但这不是标准的。我曾希望联邦查询机制可能会有所帮助,但似乎没有。

1 个答案:

答案 0 :(得分:1)

由于我手边没有您的数据,我无法可靠地测试我的查询。但是,您似乎需要subqueries

  

子查询是一种在其他查询中嵌入SPARQL查询的方法,通常用于实现无法实现的结果,例如限制查询中某些子表达式的结果数量。

在您的情况下,目标是:

  1. 获取您为ArrayList
  2. 的图表列表
  3. 对于每个图表,找到一些可能有用的三元组
  4. 由于您在查询后仅提及dc:creator,因此您查询的结果并不清楚,因为它在查询的其余部分中无处可寻。以下是您可以尝试使用子查询的方法,也许可以找到灵感来解决您的问题:

    ?name