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

标签 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"}

我尝试过分组依据和其他过滤器,但无法使其工作。 如有任何帮助,我们将不胜感激。

最佳答案

  1. 删除表示 UNION 的两行。联合用于返回与一种模式另一种模式匹配的行。您需要一行匹配一个模式另一种模式。这就是 SPARQL 默认执行的操作。将大括号 {...} 括在每个组周围。
  2. 删除FILTER。如果您以正确的方式使用变量,则不需要过滤器。
  3. 确保三个 {...} 组中的每一个都有自己单独的变量。他们不应该共享任何变量。如果您在组之间共享变量,则它们必须具有相同的值,否则该行将被删除。
  4. 顺便说一下,?subject?object?p 都是非常糟糕的变量名。以将要绑定(bind)到它的事物的类型来命名您的变量。因此,?age?voterBias 可以提供更好的名称。
  5. 创建一个在三个组之间共享的新变量,可以将其称为 ?key?ageRange,如评论中建议的那样。此变量需要保存您想要用于在组之间加入的值,例如 18-29。因此它需要在三组中的每一组中接收完全相同的值。看起来该值并不直接存在于您的数据中,因此需要使用表达式计算它,然后使用 BIND(... AS ?key) 绑定(bind)到每个组中的变量 .

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

关于java - 如何将 Sparql 查询的两个不同但相关的结果集合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752579/

相关文章:

java - Freemarker 模板引擎 <#if condition> 具有动态条件

java - 我的 switch 语句没有返回任何内容?

java - 数据导入期间超出 Fuseki GC 开销限制

rdf - 如何在 Sparql 中查询具有对象属性的类

在 jena 中运行 sparql 查询时出现 java.lang.InstantiationError

java - 如何删除耶拿的 UnionClass

java - 关于 JazzyListView Android

java - 安卓菜单和子菜单

json - 使用 JSON API 查找 DBpedia gloss

java - 如何将 JENA Sparql 查询结果集保存为 JSON?