2010-10-06 13 views
13

Mi piacerebbe analizzare un file RDF molto grande (circa 200 MB) in python. Dovrei usare il sax o qualche altra libreria? Gradirei un codice molto semplice su cui posso costruire, per esempio per recuperare un tag.Pdf RDF di grandi dimensioni in Python

Grazie in anticipo.

+0

Un video su come utilizzare SAX presso la Stanford è disponibile qui http://timmcnamara.co.nz/post/386007776/learning-about-xml-in-python-this-was-a-great –

+0

@ user201140 cosa intendi con 'recuperare un tag'? Normalmente durante l'analisi di RDF dovresti cercare le triple in esso. Potresti spiegare un po 'di più il tuo caso d'uso di RDF? –

risposta

16

Se siete alla ricerca di prestazioni veloci, allora vi consiglio di utilizzare Raptor con il Redland Python Bindings. Le prestazioni di Raptor, scritte in C, sono decisamente migliori di quelle di RDFLib. Ed è possibile utilizzare i collegamenti Python nel caso in cui non si voglia gestire C.

Un altro consiglio per migliorare le prestazioni, dimenticare l'analisi di RDF/XML, andare con altri gusti di RDF come Turtle o NTriples. L'analisi speciale di ntriple è molto più rapida dell'analisi di RDF/XML. Questo perché la sintassi ntriples è più semplice.

È possibile trasformare il vostro RDF/XML in ntriples utilizzando rapper, uno strumento che viene fornito con rapace:

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

Il file ntriples conterrà triple come:

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

e parser tendono ad essere gestione molto efficiente di questa struttura. Inoltre, la memoria è più efficiente di RDF/XML perché, come puoi vedere, questa struttura dati è più piccola.

Il codice sotto è un semplice esempio utilizzando i binding 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 

L'URI di base è l'URI prefissato nel caso in cui si utilizza URI relativi all'interno del documento RDF. È possibile controllare la documentazione sull'API di collegamenti Python Redland in here

Se non si cura molto delle prestazioni, utilizzare RDFLib, è semplice e facile da usare.

+0

Ho appena aggiunto l'esempio di codice per completare la mia risposta. –

+0

Quanto è "molto meglio"? – Buttons840

+2

così tanto che non vale la pena misurarlo. –

1

Non so se il sax è la soluzione migliore, ma IBM sembra pensare che funzioni per l'analisi XML ad alte prestazioni con Python: http://www.ibm.com/developerworks/xml/library/x-hiperfparse/. Il loro esempio RDF nani in dimensioni (200 MB contro 1,9 GB), quindi la loro soluzione dovrebbe funzionare per voi.

Gli esempi di questo articolo iniziano in modo piuttosto semplice e riprendono rapidamente.

2

Nella mia esperienza, SAX è grande per le prestazioni, ma è un dolore di scrivere. A meno che non abbia problemi, tendo ad evitare di programmare con esso.

"Molto grande" dipende dalla RAM della macchina. Supponendo che il tuo computer abbia più di 1 GB di memoria, lxml, pyxml o qualche altra libreria e andrà bene per i file 200mb.

1

Per l'elaborazione RDF in Python, è consigliabile utilizzare una libreria RDF, come RDFLib. Se è anche necessario un triplestore, sono disponibili anche soluzioni più pesanti, ma potrebbero non essere necessarie qui (PySesame, neo4jrdf con neo4jpy).

Prima di scrivere il proprio parser SAX per RDF, controlla rdfxml.py:

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

Come si importa rdfxml? si dice rinominare il riferimento –

8

I secondo il suggerimento di provare rdflib.È una prototipazione semplice e veloce, e il negozio di backend BerkeleyDB scala piuttosto bene in milioni di triple se non si desidera caricare l'intero grafico in 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