【问题标题】:Parse 88 GB rdf with PHP使用 PHP 解析 88 GB rdf
【发布时间】:2013-09-20 02:26:06
【问题描述】:

如何使用 PHP 解析 88 GB 的 RDF 文件?

这个 RDF 充满了实体和关于每个实体的事实。

我正在尝试遍历每个实体并检查每个实体的某些事实。然后将这些事实写入我之前在脚本中创建的 XML 文档。

所以当我浏览 rdf 时,我为每个实体创建一个 <card></card> 元素并给它一个名为 <facts> 的子元素。我遍历了实体上的所有事实,然后将我需要的事实写在里面,并作为<facts></facts> 中的<fact></fact> 元素子项。

如何解析 rdf、提取数据并将其写入 XML?

【问题讨论】:

  • 在处理大文件时使用expat based event driven parser 非常幸运。在那里将事件处理程序设置为输出到目标 xml 数据应该很简单。根据 rdf 的图表,在阅读文档时将其推送到数据库中然后在写入时选择返回的事实可能是有意义的。
  • @Orangepill 我宁愿不使用数据库。我知道你说这是微不足道的,但在这方面我觉得我是 5 岁。您能否发布一个答案,说明如何选择该答案。
  • 从您的 rdf 文件中发布一个 sn-p。
  • @Orangepill 感谢您的帮助。这是前几行:i.imgur.com/k1nBSEn.png 我不知道这是否有帮助。数据可供下载,压缩后要小得多:developers.google.com/freebase/data 非常感谢您提前!
  • @Orangepill 如果我不耐烦,我很抱歉。如果您能告诉我您是否可以帮助我或不打算帮助我,我将不胜感激。我在问题中添加了赏金。

标签: php rdf freebase large-data


【解决方案1】:

首先,使用 RDF 解析器。谷歌搜索 PHP RDF 解析器会得到很多结果;我个人不使用 PHP,但我确信其中一个会完成解析 RDF 的工作。但请确保它是一个流解析器,您不会在工作站的内存中保存 88G 的 RDF。

其次,您说您需要“遍历每个实体”,如果它们未按原始文件中的主题排序,或者解析器未按相同顺序报告它们,这可能会很棘手。

假设这不是问题,那么您可以将每个主题的三元组保留在本地数据结构中,并且当您获得与您在本地排队的主题不同的主题的三元组时,执行任何业务逻辑您需要并写出 XML。可能要确保您不能在本地排队太多语句以至于您会 OOM。

最后,我假设您有充分的理由采用 RDF 并将其转换为不是 RDF/XML 的 XML 格式。但我可能会重新考虑你的设计以防万一。

或者您可以将数据放入 RDF 数据库并针对它编写 SPARQL 查询,将查询结果转换为任何 XML 或您需要的任何其他内容。

【讨论】:

  • 我如何知道什么是 RDF 流解析器?我找到了easyRDF,但那是一个流RDF 解析器吗?你有 PHP 的例子吗?
  • 它被称为 streaming 解析器……你需要像 SAX 这样的东西;任何会一次通知您三倍的东西。 88G 将处于 100M 三元组的范围内,除非它是一台大型机器,否则您永远无法将所有这些都存储在内存中。不,正如我所说,我不在 PHP 中工作,所以我没有示例。但谷歌似乎发现了一些可能的例子。
  • 啊,谢谢你的指正。是的,这是真的。啊好吧。我很抱歉造成误解。谢谢。
【解决方案2】:

我认为你最好的选择是:

  1. 使用一些外部工具(可能类似于rapper?)将源文件从Turtle 转换为n-triples 格式
  2. 通过 fopen+fgets 一次迭代文件一行,因为 n-triples 定义了严格的 1-statement per 1-line 约束,这在这种情况下是完美的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多