在 Python 中解析大型 RDF

Posted

技术标签:

【中文标题】在 Python 中解析大型 RDF【英文标题】:Parse large RDF in Python 【发布时间】:2011-04-21 14:22:17 【问题描述】:

我想在 python 中解析一个非常大(大约 200MB)的 RDF 文件。我应该使用 sax 还是其他库?我会很感激一些我可以构建的非常基本的代码,比如检索标签。

提前致谢。

【问题讨论】:

有关如何使用斯坦福 SAX 的视频可在此处观看timmcnamara.co.nz/post/386007776/… @user201140 'retrieve a tag' 是什么意思?通常在解析 RDF 时,您应该寻找其中的三元组。你能解释一下你的 RDF 用例吗? 【参考方案1】:

如果您正在寻找快速的性能,那么我建议您使用Raptor 和Redland Python Bindings。用 C 语言编写的 Raptor 的性能比 RDFLib 好得多。如果你不想处理 C,你可以使用 python 绑定。

另一个提高性能的建议,忘记解析 RDF/XML,使用其他类型的 RDF,如 Turtle 或 NTriples。专门解析 ntriples 比解析 RDF/XML 快得多。这是因为 ntriples 语法更简单。

您可以使用 rapper(rapper 附带的一个工具)将您的 RDF/XML 转换为 ntriples:

rapper -i rdfxml -o ntriples YOUR_FILE.rdf > YOUR_FILE.ntriples

ntriples 文件将包含三元组,例如:

<s1> <p> <o> .
<s2> <p2> "literal" .

并且解析器往往会非常有效地处理这种结构。此外,内存方面比 RDF/XML 更有效,因为如您所见,这种数据结构更小。

下面的代码是一个使用 redland python 绑定的简单示例:

import RDF
parser=RDF.Parser(name="ntriples") #as name for parser you can use ntriples, turtle, rdfxml, ...
model=RDF.Model()
stream=parser.parse_into_model(model,"file://file_path","http://your_base_uri.org")
for triple in model:
    print triple.subject, triple.predicate, triple.object

基本 URI 是前缀 URI,以防您在 RDF 文档中使用相对 URI。您可以在here 中查看有关 Python Redland 绑定 API 的文档

如果你不太在意性能,那就用RDFLib吧,简单好用。

【讨论】:

这么多,不值得衡量。 我做了一些基准测试来比较 rdflib 和 Redland RDF,Redland 确实更快,虽然它似乎更容易出错:5mb file RDF = 1.4 seconds, rdflib = 12.8 秒。 50mb 文件 RDF = 9.4 秒,rdflib = 1 分 7 秒。 535 mb 文件 RDF = 无法正常工作,rdflib = 12 分 3 秒。此外,对于那些正在寻找有关如何使用该库的另一个示例的人,请参阅 repo 中的 examples.py 文件【参考方案2】:

我赞成您试用 rdflib 的建议。它的原型设计既好又快,如果您不想将整个图形加载到内存中,BerkeleyDB 后端存储可以很好地扩展到数百万个三元组。

import rdflib

graph = rdflib.Graph("Sleepycat")
graph.open("store", create=True)
graph.parse("big.rdf")

# print out all the triples in the graph
for subject, predicate, object in graph:
    print subject, predicate, object

【讨论】:

【参考方案3】:

根据我的经验,SAX 非常适合性能,但编写起来很痛苦。除非我遇到问题,否则我倾向于避免使用它进行编程。

“非常大”取决于机器的 RAM。假设您的计算机有超过 1GB 的内存,lxmlpyxml 或其他一些库 e 将适用于 200mb 文件。

【讨论】:

【参考方案4】:

不确定 sax 是否是最佳解决方案,但 IBM 似乎认为它适用于使用 Python 进行高性能 XML 解析:http://www.ibm.com/developerworks/xml/library/x-hiperfparse/。他们的示例 RDF 在大小上让您相形见绌(200MB 与 1.9GB),因此他们的解决方案应该适合您。

本文的示例非常基础,很快就能上手。

【讨论】:

【参考方案5】:

对于 Python 中的 RDF 处理,请考虑使用 RDF 库,例如 RDFLib。如果您还需要三重存储,也可以使用更重量级的解决方案,但这里可能不需要(PySesame、neo4jrdf 和neo4jpy)。

在为 RDF 编写自己的 SAX 解析器之前,请查看 rdfxml.py:

import rdfxml
data = open('data.rdf', 'r').read()
rdfxml.parseRDF(data)

【讨论】:

如何导入 rdfxml?它说重命名参考【参考方案6】:

解析 RDF 文件的速度非常快的库是 LightRdf。它可以通过 pip 安装。代码示例可以在项目页面上找到。

如果你想从压缩的 RDF 文件中解析三元组,你可以这样做:

import lightrdf
import gzip

RDF_FILENAME = 'data.rdf.gz'

f = gzip.open(RDF_FILENAME, 'rb')
doc = lightrdf.RDFDocument(f, parser=lightrdf.xml.PatternParser)
for (s, p, o) in doc.search_triples(None, None, None)):
            print(s, p, o)

【讨论】:

以上是关于在 Python 中解析大型 RDF的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何工具可以可视化 RDF 图? (请附上截图)

如何在资源有限的 Haskell 中解析大型 XML 文件?

如果在 perl 中解析大型 xlsx 文件,则处理异常 [关闭]

Python 处理包含对象列表的大型 JSON 文件

在 Java 中使用 SAX 解析大型 XML

在 JAVA 中解析大型 XML 文档