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

问题描述 投票:0回答:1

我正在研究一个项目,该项目发现美国选举中的投票趋势与州的人口统计数据和各自的投票偏好之间存在相关性。我有三个单独的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”}

我尝试过分组和其他过滤器,但无法使其工作。任何帮助表示赞赏。

java sparql jena semantic-web
1个回答
2
投票
  1. 删除说UNION的两行。 Union用于返回与一个模式或另一个模式匹配的行。您想要一个匹配一个模式和另一个模式的行。这就是SPARQL默认执行的操作。保持每个组周围的花括号{...}
  2. 删除FILTER。如果以正确的方式使用变量,则不需要过滤器。
  3. 确保三个{...}组中的每一个都有自己独立的变量。他们不应该分享任何变数。如果在组之间共享变量,则它们必须具有相同的值,否则将删除该行。
  4. 顺便说一下,?subject?object?p是非常可怕的变量名。在要绑定到它的事物之后命名变量。所以,?age?voterBias是为了更好的名字。
  5. 创建一个在三个组之间共享的新变量,可以将其命名为?key,或者在评论中提出的?ageRange。此变量需要保存您要用于在组之间连接的值,例如18-29。因此,它需要在三个组中的每个组中获得完全相同的值。看起来这个值不会直接存在于您的数据中,因此需要使用表达式计算,然后使用BIND(... AS ?key)绑定到每个组中的变量。

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

© www.soinside.com 2019 - 2024. All rights reserved.