数据库技术(Database Technology)作业

Cardinality Estimation using Characteristic Sets

– RDF格式, rdfs, tdb, notation3, n-triple.

– Jena API, TDB 打开数据库, 建立Model

– SPARQL, Star-join.


这project比想象的要难. Characteristic Set 算法很简单, 但是需要…多次扫描整个数据库.
一开始, 想要先算Plain Set without annotations 然后再计算annotations, 当然失败告终, 数据结构设计的太差太差.
后来有重构(每次project都要这样, 真不知道怎么办, 真的需要重看软工的书了), 略好些.
幻想用简单的SPARQL先分组再全部扫描, 当然悲剧了. 那时还不知道ARQ 中 ResultSet竟然是个流, 还天真以为会一次做完查询然后把结果存内存里.
貌似数据库结果都是这样做的, 本科时数据量太小没意识到.
Stackoverflow里问人得知还有个命令叫 group_concat, 果断用之, 把所有同样集合里的count全部concat起来, 然后再拆分. 嗯…一下是我写出来的..

	String queryString =
		 "SELECT (COUNT(?s) AS ?distinct) " 
		+ "?propset "
	        + "(group_concat(?count; separator = "\t") AS ?counts)"
		+ "{"
		+ "SELECT ?s "
		+ "(group_concat(?p; separator = " ") AS ?propset) " 
		+ "(group_concat(?c; separator = " ") AS ?count)" 
		+ " {"
		+ "SELECT ?s ?p ?c"
		+ " WHERE "
		+ "{"
		+ "SELECT ?s ?p (COUNT(*) AS ?c)  "
		+ "WHERE { ?s ?p ?o .}"
		+ " GROUP BY ?s ?p"
		+ "} ORDER BY ?s ?p"
		+ "} GROUP BY ?s ORDER BY ?s"
		+ "} GROUP BY ?propset ORDER BY ?propset";

当然, 效率无比低下, 貌似要扫三次整个数据库, 还不算group by和order by的代价.
在Yago上彻底悲剧了, 一夜都没结果.

写信问作者, 他说要三步…最后还是要扫整个数据库并进行group by的. 真想骂句竟然好意思在文章里写”implemented it by only two group-by operators”
不过我想他也是受不了我信里明显讽刺才详细回我的吧= =


嗯现在知道为什么慢了, 就是因为TDB不是一次性载入的. 然后自然就想直接把YAGO载入内存里嘛, 反正我有8G, 区区2G数据算什么?
于是我又悲剧了. Jena无法解析Yago..说好的都是N3文件呢, 为什么无法解析呢.
继续天真, 找了几个文本工具想把不能解析的地方改过去, 当然又悲剧了. btw, Notepad++无法打开这么大的, vim可以打开, 可以修改, 保存的话就直接挂了. 010Edit倒是可以,
但我发现有很多地方需要修改啊, 用下搜索吧…于是这软件也挂了.
这就怪了啊, 为什么无法解析, 找了下发现YAGO这货竟然是用ASCII编码的..然后他还能自成一套能把UTF-8的东西也编进去, 完全震惊了.
他们也没提供可以转的工具, 只有一个可以转String的. 那我岂不是要2G的String?
最后..既然Jena可以读TDB, 那我把TDB转成N3不就行了?
貌似还是天真了, 从TDB中创建的Model, write了20分钟, 文件大小还是0, 不知道他在干嘛…
嗯睡觉了, 明天早上来看. 希望有惊喜.

Leave a Reply

Your email address will not be published. Required fields are marked *