如何将Sparql查询的两个不同但相关的结果集组合为一个?

时间:2019-04-18 19:26:53

标签: java sparql jena semantic-web

我正在从事一个项目,该项目将发现美国大选的投票趋势与该州的人口统计数据及其各自的投票偏好之间的相关性。 我有三个单独的rdf文档,它们包含相同的键,但是保存不同类型的数据。 因此,我在Fuseki服务器上尝试了以下SPARQL查询,

SELECT ?p ?o1 ?object3
WHERE {
   {  
     ?subject <http://semanticspiders.org/demographic#AZ> ?object .
     ?object <http://semanticspiders.org/demographic#age> ?o .
     ?o ?p ?o1
   } 

  UNION
  {
     ?subject <http://semanticspiders.org/voterTurnout#AZ> ?object .
     ?object <http://semanticspiders.org/voterTurnout#age> ?o .
     ?o ?p ?o1

  }
  UNION 
  {
     ?subject <http://semanticspiders.org/voterBias#age> ?object .
     ?object ?p ?object2 .
     ?object2 <http://semanticspiders.org/voterBias#left> ?object3


  }
  FILTER (?p = <http://semanticspiders.org/demographic#18-29> || ?p = <http://semanticspiders.org/voterBias#18-29>)


}  

这给了我以下结果。

Sparql results

但是我希望结果集如下所示- {18-29,“ 21.9”,“ 5.161”}

我尝试了group by和其他过滤器,但无法正常工作。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

  1. 删除两行,即UNION。联合用于返回与一个模式匹配的行。您需要与一个模式匹配的行。这就是SPARQL在默认情况下所做的。将花括号{...}留在每组中。
  2. 删除FILTER。如果以正确的方式使用变量,则不需要过滤器。
  3. 请确保三个{...}组中的每个组都有自己独立的变量。它们不应共享任何变量。如果您在组之间共享变量,则它们必须具有相同的值,否则该行将被删除。
  4. 顺便说一下,?subject?object?p是非常糟糕的变量名。用将要绑定的变量命名变量。因此,?age?voterBias的名字更好。
  5. 制作一个在三个组之间共享的 新变量,可以将其命名为?key或评论中建议的?ageRange。此变量需要保存要用于在组之间进行联接的值,例如18-29。因此,它需要在三个组中的每个组中接收完全相同的值。似乎该值并不直接存在于您的数据中,因此需要使用表达式进行计算,然后使用BIND(... AS ?key)将其绑定到每个组中的变量。

在执行此操作时,您可能希望分别处理三个组中的每一个,并且只有在每个组工作后才将它们全部放入查询中。基本上,每个组的结果都需要?key的值在两个组之间是一致的,否则结果中只有不与另一个组共享的变量。