在 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 的内存,lxml
、pyxml
或其他一些库 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在资源有限的 Haskell 中解析大型 XML 文件?