我目前正在为我的应用程序使用 freebase 数据...只想要电影、电视等域中的一些信息。发现将来不支持 tsv 转储并且不完整。quad 转储包含所有需要的信息。问题是更新数据库,应该再次下载整个转储并与已经下载和处理的数据进行交叉检查,然后进行更新。有没有其他方法可以更新数据或获取增量更新?
问问题
257 次
2 回答
1
您可以在 API 中查询自上次更新以来在您感兴趣的域中发生的更改,但取决于更改的数量,您可能会遇到配额问题。
没有产生增量转储,因此您可以使用两个完整的转储自己生成差异,但这样做很简单,特别是因为新的 RDF 转储似乎是按主题 MID 排序的,这与四元转储不同。
于 2012-12-11T20:04:42.273 回答
1
正如 Tom 指出的那样,新的 RDF 转储按主题排序,这使您可以通过遍历文件来有效地区分整个数据集。基本伪代码如下:
- 跳过两个文件开头的前缀标题
- 虽然两个文件中都剩下几行:
- 从每个文件中读取一行
- 如果旧文件中的主题 ID 大于新文件中的主题 ID:
- 从具有相同主题 ID 的新文件中读取所有后续行
- 将此主题添加到“添加的主题”列表中
- 将此主题的所有行添加到“添加的事实”列表中
- 否则,如果旧文件中的主题 ID 小于新文件中的主题 ID:
- 从具有相同主题 ID 的旧文件中读取所有后续行
- 将此主题添加到“已删除主题”列表中
- 将此主题的所有行添加到“已删除事实”列表中
- 否则,如果两个文件中的主题 ID 匹配:
- 从具有相同主题 ID 的两个文件中读取所有后续行
- 区分行以找出已添加/删除的行
- 将所有添加的行添加到“添加的事实”列表中
- 将所有已删除的行添加到“已删除的事实”列表中
- 通过按以下顺序合并所有更改列表来输出您的补丁:
- 删除的事实
- 删除的主题
- 添加的主题
- 补充事实
该算法以线性时间运行,内存使用量很少,因此您可以轻松地在本地计算机上处理数 GB 的文件。
获得 RDF 转储的差异后,您需要编写一些代码将补丁应用到现有数据库。由于补丁的排序方式,在尝试添加或删除事实之前,您始终可以依赖数据库中存在的主题。
于 2012-12-12T23:05:40.450 回答