如何将 Sparql 查询的两个不同但相关的结果集合并为一个?
How to combine two different but correlated result sets of a Sparql query into one?
我正在开展一个项目,旨在发现美国选举的投票趋势与一个州的人口统计数据以及他们各自的投票偏好之间的相关性。
我有三个单独的 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>)
}
这给了我以下结果。
但是我希望结果集如下所示 -
{18-29,"21.9","5.161"}
我试过分组依据和其他过滤器,但无法正常工作。
感谢任何帮助。
- 删除
UNION
两行。 Union 用于返回匹配一种模式 或 另一种模式的行。您想要一行匹配一个模式 和 另一个模式。这就是 SPARQL 默认执行的操作。保持每个组周围的大括号 {...}
。
- 删除
FILTER
。如果以正确的方式使用变量,则不需要过滤器。
- 确保三个
{...}
组中的每一个都有自己独立的变量。他们不应该共享任何变量。如果您在组之间共享变量,那么它们 必须 具有相同的值,否则该行将被删除。
- 顺便说一下,
?subject
、?object
和 ?p
是非常糟糕的变量名。在将要绑定到它的东西之后命名你的变量。因此,?age
或 ?voterBias
可以提供更好的名称。
- 创建一个是在三个组之间共享的新变量,可以将其称为
?key
,或如评论中所建议的?ageRange
。此变量需要保存要用于在组之间加入的值,例如 18-29
。所以它需要在三个组中的每一个中接收完全相同的值。看起来该值并不直接存在于您的数据中,因此需要使用表达式计算它,然后使用 BIND(... AS ?key)
. 将其绑定到每个组中的变量
在执行此操作时,您可能希望分别处理三个组中的每一个,并且仅在每个组完成后才将它们全部放入查询中。基本上,每个组的结果需要 ?key
具有在组之间一致的值,否则结果中只有不与另一组共享的变量。
我正在开展一个项目,旨在发现美国选举的投票趋势与一个州的人口统计数据以及他们各自的投票偏好之间的相关性。 我有三个单独的 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>)
}
这给了我以下结果。
但是我希望结果集如下所示 - {18-29,"21.9","5.161"}
我试过分组依据和其他过滤器,但无法正常工作。 感谢任何帮助。
- 删除
UNION
两行。 Union 用于返回匹配一种模式 或 另一种模式的行。您想要一行匹配一个模式 和 另一个模式。这就是 SPARQL 默认执行的操作。保持每个组周围的大括号{...}
。 - 删除
FILTER
。如果以正确的方式使用变量,则不需要过滤器。 - 确保三个
{...}
组中的每一个都有自己独立的变量。他们不应该共享任何变量。如果您在组之间共享变量,那么它们 必须 具有相同的值,否则该行将被删除。 - 顺便说一下,
?subject
、?object
和?p
是非常糟糕的变量名。在将要绑定到它的东西之后命名你的变量。因此,?age
或?voterBias
可以提供更好的名称。 - 创建一个是在三个组之间共享的新变量,可以将其称为
?key
,或如评论中所建议的?ageRange
。此变量需要保存要用于在组之间加入的值,例如18-29
。所以它需要在三个组中的每一个中接收完全相同的值。看起来该值并不直接存在于您的数据中,因此需要使用表达式计算它,然后使用BIND(... AS ?key)
. 将其绑定到每个组中的变量
在执行此操作时,您可能希望分别处理三个组中的每一个,并且仅在每个组完成后才将它们全部放入查询中。基本上,每个组的结果需要 ?key
具有在组之间一致的值,否则结果中只有不与另一组共享的变量。