设置
数据来源:http://www.wien.gv.at/statistik/ogd/vie_101.csv 研究问题(RQ): RQ1:有多少人在每次人口普查总住在维也纳? RQ2:每个人口普查在维也纳各区居住多少人?
制备
为了回答该RQ DB被选择了postgre。坚持俗语说:“哪里有一个shell,哪里有一个方法”,这段代码展示了BASH(CLI Debian/Ubuntu flavored)的整洁解决方案。另外,在创建需要进一步处理的文件 时,从BASH与postgre进行交互要容易得多。关于安装过程,请咨询: https://tecadmin.net/install-postgresql-server-on-ubuntu/
首先下载使用wget的文件:
cd /path/to/directory/ ;
wget -O ./vie_101.csv http://www.wien.gv.at/statistik/ogd/vie_101.csv ;
然后看看您最喜爱的电子表格计算程序(自由报办公室计算)的文件。 vie_101应该使用UTF-8编码,并且可能使用半列\;分隔符。打开, 检查,更改,保存。 为了便于在线处理,需要进行一些重新格式化。首先,用适当的列名创建头文件 。其次,下载的文件是“斩首”(前两行是 删除)和“剪切”(到感兴趣的列)。最后,它被附加到头文件。
echo 'DISTRICT,POPULATION,MALE,FEMALE,DATE' > ./vie.csv ;
declare=$(sed -e 's/,/ INT,/g' ./vie.csv)' INT' ;
sed 's/\;/\,/g' ./vie_101.csv | sed 's/\.//g' | tail -n+3 | cut -d ','
-f4,6-9 >> ./vie.csv ;
Postgre
为了将数据加载到postgres的架构需要先创建: 回声 “创建表争夺($申报);” | sudo -u postgres psql; 为了实际将数据加载到postgres中,需要将以前创建并格式化的文件(vie.csv) 复制到超级用户可通过postgres访问的文件夹中。只有这样才能执行复制 命令将数据加载到postgres中。需要注意的是,此操作需要root权限 (sudo)。
sudo cp ./vie.csv /var/lib/postgresql/ ;
echo "\copy vie from '/var/lib/postgresql/vie.csv' delimiter ',' csv
header ;" | sudo -u postgres psql ;
XML模式
之前我们创建XML文档,我们来设计我们的文件的结构。我们决定 创建一个XML模式(schema.xsd)而不是DTD。 我们的模式定义了一个根元素,它的子元素是复杂的元素。元素可以以任意数量出现。元素的子元素是 ,和。这5个元素(同胞)是简单的 元素,并且定义的值类型始终是一个整数。
与Postgre
创建XML既然最终目标是通过一个XQuery需要一个XML文件来回答RQ。此文件 (xml.xml)需要正确格式化并且格式正确。至于下一步query_to_xml 命令管道输送到Postgres的-Aqt用于:
-A [aligned mode disable, remove header and + at end of line]
-q [quiet output]
-t [tuples only, removes footer]
echo "select query_to_xml('select * from vie order by date asc', true,
false, 'vie') ;" | sudo -u postgres psql -Aqt > ./vie_data.xml ;
现在,表中的模式导出与table_to_xmlschema是很重要的()。
echo "select table_to_xmlschema('vie', true, false, '') ;" | sudo -u
postgres psql -Aqt > ./vie_schema.xsd ;
这就结束了postgre和BASH中的所有任务。随着最后的命令basex可以启动。
basexgui
的Xquery
使用basex XML文件可以很容易地针对该架构与验证通过: 验证:XSD( 'vie_data.xml', 'vie_schema.xsd') XML文件可通过单击imporet:
数据库 - >新建
常规 - >浏览选择XML文件。
解析如果未启用,请打开“启用名称空间”。
OK
RQ1只能通过一个for循环的“日期”分组的数据来回答。结果通过保存 :
file:write('path/to/directory/file_name').
file:write('/path/to/directory/population_year_total.xml',
for $row in //table/row
group by $date := $row/date
order by $date ascending
return
population="{sum($row/population)}">
)RQ2由for循环嵌套2 answerd。外部循环按DATE进行分组,并返回给定的每个DATE的总人口数 。内部循环由DISTRICT分组,因此,它返回一个 总和的人口。
file:write('/path/to/directory/district_year_subtotal.xml',
for $row in //table/row
group by $date:= $row/date
order by $date ascending
return
population="{sum($row/population)}">{
for $sub_item in $row
group by $district := $sub_item/district
order by $district ascending
return
population="{sum($sub_item/population)}"/>
}
)完成