2010-10-06 26 views
13

Me gustaría analizar un archivo RDF muy grande (aproximadamente 200 MB) en python. ¿Debo usar saxofón o alguna otra biblioteca? Apreciaría un código muy básico sobre el que pueda construir, digamos para recuperar una etiqueta.Parse large RDF en Python

Gracias de antemano.

+0

un vídeo sobre cómo utilizar SAX de Stanford está disponible aquí http://timmcnamara.co.nz/post/386007776/learning-about-xml-in-python-this-was-a-great –

+0

@ user201140 ¿Qué quieres decir con 'recuperar una etiqueta'? Normalmente al analizar RDF debes buscar los triples en él. ¿Podría explicar un poco más su caso de uso de RDF? –

Respuesta

16

Si usted está buscando para un rendimiento rápido, te recomiendo que uses Raptor con el Redland Python Bindings. El rendimiento de Raptor, escrito en C, es mucho mejor que RDFLib. Y puede usar los enlaces de python en caso de que no desee tratar con C.

Otro consejo para mejorar el rendimiento, olvídese de analizar RDF/XML, vaya con otro sabor de RDF como Turtle o NTriples. El análisis de ntriples es mucho más rápido que el análisis RDF/XML. Esto se debe a que la sintaxis ntriples es más simple.

Usted puede transformar su RDF/XML en N-Triples utilizando rapero, una herramienta que viene con raptor:

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

El archivo N-Triples contendrá triples como:

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

y analizadores tienden a ser muy eficiente manejando esta estructura. Además, la memoria inteligente es más eficiente que RDF/XML porque, como puede ver, esta estructura de datos es más pequeña.

El código siguiente es un ejemplo sencillo utilizando los enlaces de Python redland:

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 

El URI base es el URI prefijado en el caso de usar URIs relativos dentro de su documento RDF. Puede consultar la documentación sobre la API de enlaces de Python Redland en here

Si no le importa mucho el rendimiento, utilice RDFLib, es simple y fácil de usar.

+0

Acabo de agregar el ejemplo de código para completar mi respuesta. –

+0

¿Cuánto es "mucho mejor"? – Buttons840

+2

tanto que no vale la pena medirlo. –

1

No estoy seguro de si sax es la mejor solución, pero IBM parece pensar que funciona para el análisis XML de alto rendimiento con Python: http://www.ibm.com/developerworks/xml/library/x-hiperfparse/. Su ejemplo RDF empequeñece el suyo en tamaño (200 MB frente a 1.9 GB), por lo que su solución debería funcionar para usted.

Los ejemplos de este artículo comienzan bastante básicos y resuelven rápidamente.

2

En mi experiencia, SAX es ideal para el rendimiento, pero es un dolor de escribir. A menos que tenga problemas, tiendo a evitar la programación con él.

"Muy grande" depende de la memoria RAM de la máquina. Suponiendo que su computadora tiene más de 1 GB de memoria, lxml, pyxml o alguna otra biblioteca e estará bien para archivos de 200 mb.

1

Para el procesamiento RDF en Python, considere utilizar una biblioteca RDF como RDFLib. Si también necesita un almacén triple, también hay disponibles más soluciones de peso pesado, pero puede que no se necesiten aquí (PySesame, neo4jrdf con neo4jpy).

Antes de escribir su propio analizador SAX para RDF, echa un vistazo a rdfxml.py:

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

¿Cómo importo rdfxml? dice rename reference –

8

En segundo lugar, sugiero que pruebe rdflib.Es un buen y rápido prototipado, y la tienda de backend de BerkeleyDB se adapta bastante bien a los millones de triples si no quieres cargar todo el gráfico en la memoria.

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