在Python中解析大型RDF
我想用Python来解析一个非常大的RDF文件,大约有200MB。请问我应该使用sax还是其他什么库呢?如果能给我一些非常基础的代码,让我可以在此基础上进行扩展,比如说提取一个标签,那就太好了。
提前谢谢你们。
6 个回答
12
我也建议你试试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
21
如果你想要快速的性能,我建议你使用Raptor,配合Redland Python Bindings。Raptor是用C语言写的,性能比RDFLib要好得多。如果你不想接触C语言,可以使用这些Python绑定。
另一个提升性能的建议是,别再使用RDF/XML格式了,换成其他类型的RDF,比如Turtle或者NTriples。特别是解析ntriples的速度比解析RDF/XML快得多,因为ntriples的语法更简单。
你可以使用rapper这个工具把你的RDF/XML转换成ntriples,rapper是和Raptor一起提供的:
rapper -i rdfxml -o ntriples YOUR_FILE.rdf > YOUR_FILE.ntriples
生成的ntriples文件会包含像这样的三元组:
<s1> <p> <o> .
<s2> <p2> "literal" .
解析器处理这种结构时通常非常高效。此外,从内存使用上来说,ntriples比RDF/XML更高效,因为你可以看到,这种数据结构更小。
下面的代码是一个使用Redland Python Bindings的简单示例:
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是指如果你在RDF文档中使用相对URI时的前缀URI。你可以在这里查看关于Python Redland绑定API的文档。
如果你对性能不是特别在意,可以使用RDFLib,它简单易用。