在Python中解析大型RDF

use*_*est 15 python xml rdf sax

我想在python中解析一个非常大的(大约200MB)RDF文件.我应该使用萨克斯还是其他一些图书馆?我很欣赏一些我可以构建的非常基本的代码,比如检索一个标签.

提前致谢.

Man*_*res 18

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

另一个提高性能的建议,忘记解析RDF/XML,与其他风格的RDF一样,如Turtle或NTriples.特别解析ntriples比解析RDF/XML要快得多.这是因为ntriples语法更简单.

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

rapper -i rdfxml -o ntriples YOUR_FILE.rdf > YOUR_FILE.ntriples
Run Code Online (Sandbox Code Playgroud)

ntriples文件将包含三元组:

<s1> <p> <o> .
<s2> <p2> "literal" .
Run Code Online (Sandbox Code Playgroud)

解析器往往非常有效地处理这个结构.此外,内存方式比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
Run Code Online (Sandbox Code Playgroud)

如果您在RDF文档中使用相对URI,则基URI是带前缀的URI.您可以在此处查看有关Python Redland绑定API的文档

如果您不太关心性能,那么使用RDFLib,它简单易用.

  • 非常值得衡量它. (3认同)

小智 8

我第二个建议你尝试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
Run Code Online (Sandbox Code Playgroud)