我必须检查有关所述人口的数据集的一致性; L级所有行政单位A的人口总和必须等于所有行政单位A所属的L + 1级行政单位B的人口。这只能在一个查询中。我尝试过以下代码,但结果一无所获(条件似乎没有效果)。我想没有结果因为"总和"时间执行。我该怎么做才能解决这个问题?
prefix ns: <http://geo.linkedopendata.gr/gag/ontology/>
SELECT ?condition WHERE {
?x ns:has_official_name ?decentralized .
?x ns:has_population ?decentralized_population .
?y ns:has_official_name ?region .
?y ns:has_population ?region_population .
?z ns:has_official_name ?regional_unit .
?z ns:has_population ?regional_unit_population .
?z ns:belongs_to ?y .
?y ns:belongs_to ?x .
FILTER regex(str(?decentralized), \"DECENTRALIZED\") .
FILTER regex(str(?region), \"REGION\") .
FILTER regex(str(?regional_unit), \"REGIONAL UNIT\") .
FILTER (!regex(str(?region), \"REGIONAL\")) .
BIND(SUM(?decentralized_population) AS ?sum_decentralized_population) .
BIND(SUM(?region_population) AS ?sum_region_population) .
BIND(SUM(?regional_unit_population) AS ?sum_regional_unit_population) .
OPTIONAL {
BIND( IF(?sum_decentralized_population = ?sum_region_population &&
?sum_region_population = ?sum_regional_unit_population, 'TRUE', 'FALSE')
AS ?condition) .
}
}
GROUP BY ?condition
@Joshua,假设我们在L级有7个单位。这些是:
答:人口:100
B:人口:150
C:人口:300D:人口:200
E:人口:250
F:人口:150
G:人口:150在L + 1级,我们有13个单位,其中:
unit_1:人口30,属于A
unit_2:人口70,属于A
unit_3:人口80,属于B
unit_4:人口70,属于B
unit_5:人口200,属于C
unit_6:人口100,属于C
unit_7:人口130,属于D
unit_8:人口70,属于D
unit_9:人口180,属于E
unit_10:人口70,属于E
unit_11:人口150,属于F
unit_12:人口100,属于G
unit_13:人口50,属于G
在L + 2级,我们有74个单位,其中:
unit_a:人口15,属于unit_1
unit_b:人口5,属于unit_1
unit_c:人口3,属于unit_1
unit_d:人口7,属于unit_1
unit_e:人口40,属于unit_1
unit_f:人口20,属于unit_1
unit_g:人口10,属于unit_1
等......(人口数量不是真实的)
现在,我必须检查单位A(L级为100)的人口是否等于:
unit_1和unit_2的人口总和(L + 1级为30 + 70)
unit_a,unit_b,unit_c,unit_d,unit_e,unit_f和unit_g(15 + 5 + 3 + 7 + 40 + 20 + 10等级L + 2)的总和
.....................
我在eclipse中使用sesame,我的查询是:
String queryStringAndy =&#34; PREFIX rdf:http://www.w3.org/1999/02/22-rdf-syntax-ns#&#34; + &#34; PREFIX gag:http://geo.linkedopendata.gr/gag/ontology/&#34; +
&#34; SELECT DISTINCT?dec_pop(SUM(?reg_pop)AS?sum_reg_pop)(SUM(?reg_unit_pop)AS?sum_reg_unit_pop)(SUM(?mun_pop)AS?sum_mun_pop)&#34; +
&#34;在哪里{?x rdf:type gag:Decentralized_Unit。&#34; +
&#34; ?x gag:has_official_name?分散。 &#34; +
&#34; ?x gag:has_population?dec_pop。 &#34; +
&#34; ?rdf:type gag:Region。&#34; +
&#34; ?gag:has_official_name?region。 &#34; +
&#34; ?gag:has_population?reg_pop。 &#34; +
&#34; ?z rdf:type gag:Regional_Unit。&#34; +
&#34; ?z gag:has_official_name?regional_unit。 &#34; +
&#34; ?z gag:has_population?reg_unit_pop。 &#34; +
&#34; ?wddf:type gag:Municipality。&#34; +
&#34; ?w gag:has_official_name?municipality。 &#34; +
&#34; ?w gag:has_population?mun_pop。 &#34; +
&#34; ?gag:belongs_to?x。&#34; +
&#34; ?z gag:belongs_to?y。&#34; +
&#34; ?w gag:belongs_to?z。}&#34; +
&#34; GROUP BY?dec_pop&#34; ;
dec_pop:L级单位的数量
reg_pop:L + 1级单位的数量
reg_unit_pop:L + 2级单位的数量
mun_pop:L + 3级单位的人口
奇怪的是,当我必须将?dec_pop与一个和表达式进行比较时,结果是正确的。但是当我输入更多的金额时,只有最后一个计算级别的单位总和等于?dec_pop。我希望现在更清楚了。
答案 0 :(得分:3)
您写的查询不合法SPARQL(例如,您不应该逃避引号)并且您没有向我们展示数据,因此很难说您的查询中实际出现了什么问题。但是,您尝试执行的操作在SPARQL中是可以实现的。例如,假设你已经得到了这些数据,其中的东西可能有孩子,事情可能有重要性:
@prefix : <urn:ex:>
:a :count 23 ;
:hasChild :b, :c .
:b :count 10 .
:c :count 13 ;
:hasChild :d, :e .
:d :count 6 .
:e :count 6 .
现在,首先要检索所需的数据。您可以使用以下查询检索带有子项的每个节点,其声明的计数以及子项计数的总和:
prefix : <urn:ex:>
select ?x ?count (sum(?_subcount) as ?subcount) where {
?x :count ?count ;
:hasChild/:count ?_subcount
}
group by ?x ?count
-------------------------
| x | count | subcount |
=========================
| :a | 23 | 23 |
| :c | 13 | 12 |
-------------------------
声明的值:a是正确的,但是:c是错误的。您可以通过拥有:
进行过滤来选择不一致的值prefix : <urn:ex:>
select ?x ?count (sum(?_subcount) as ?subcount) where {
?x :count ?count ;
:hasChild/:count ?_subcount
}
group by ?x ?count
having (?count != ?subcount)
-------------------------
| x | count | subcount |
=========================
| :c | 13 | 12 |
-------------------------
将此示例更新为您的实际数据应该不会太难。