2010-10-06 3 views
13

Tôi muốn phân tích cú pháp tệp RDF rất lớn (khoảng 200MB) trong python. Tôi có nên sử dụng sax hoặc một số thư viện khác không? Tôi đánh giá cao một số mã rất cơ bản mà tôi có thể xây dựng trên, nói để lấy một thẻ.Phân tích cú pháp RDF lớn trong Python

Xin cảm ơn trước.

+0

Một đoạn video về cách sử dụng SAX từ Stanford có sẵn ở đây http://timmcnamara.co.nz/post/386007776/learning-about-xml-in-python-this-was-a-great –

+0

@ user201140 ý của bạn là gì với 'truy xuất thẻ'? Thông thường khi phân tích cú pháp RDF, bạn nên tìm kiếm các bộ ba trong đó. Yo có thể giải thích thêm một chút trường hợp sử dụng của bạn của RDF? –

Trả lời

16

Nếu bạn đang tìm kiếm hiệu quả nhanh chóng sau đó tôi muốn khuyên bạn nên sử dụng Raptor với Redland Python Bindings. Hiệu suất của Raptor, được viết bằng C, là cách tốt hơn RDFLib. Và bạn có thể sử dụng các ràng buộc python trong trường hợp bạn không muốn đối phó với C.

Một lời khuyên khác để cải thiện hiệu suất, quên phân tích cú pháp RDF/XML, đi với hương vị khác của RDF như Turtle hoặc NTriples. Các phân tích cú pháp đặc biệt phân tích nhanh hơn nhiều so với phân tích cú pháp RDF/XML. Điều này là do cú pháp ntriples đơn giản hơn.

Bạn có thể chuyển đổi RDF/XML vào ntriples sử dụng rapper, một công cụ mà đi kèm với Raptor:

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

File ntriples sẽ chứa gấp ba như:

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

và phân tích cú pháp có xu hướng xử lý rất hiệu quả cấu trúc này. Hơn nữa, trí nhớ thông minh hiệu quả hơn RDF/XML vì bạn có thể thấy cấu trúc dữ liệu này nhỏ hơn.

Đoạn code dưới đây là một ví dụ đơn giản bằng cách sử dụng bindings 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 

Các cơ sở URI là URI tiền tố trong trường hợp bạn sử dụng URI tương đối bên trong tài liệu RDF của bạn. Bạn có thể kiểm tra tài liệu về API ràng buộc Python Redland trong here

Nếu bạn không quan tâm nhiều đến hiệu suất thì sử dụng RDFLib, nó rất đơn giản và dễ sử dụng.

+0

Tôi chỉ cần thêm ví dụ mã để hoàn thành câu trả lời của tôi. –

+0

Bao nhiêu là "tốt hơn"? – Buttons840

+2

rất nhiều mà không phải là giá trị đo nó. –

1

Không chắc chắn nếu sax là giải pháp tốt nhất, nhưng IBM dường như nghĩ rằng nó hoạt động cho phân tích cú pháp XML hiệu suất cao với Python: http://www.ibm.com/developerworks/xml/library/x-hiperfparse/. Ví dụ RDF của họ làm giảm kích thước của bạn (200MB so với 1,9 GB), vì vậy giải pháp của họ sẽ phù hợp với bạn.

Ví dụ của bài viết này bắt đầu khá cơ bản và nhận một cách nhanh chóng.

2

Theo kinh nghiệm của tôi, SAX rất tuyệt vời cho hiệu suất nhưng đó là một nỗi đau để viết. Trừ khi tôi gặp vấn đề, tôi có xu hướng tránh lập trình với nó.

"Rất lớn" phụ thuộc vào RAM của máy. Giả sử rằng máy tính của bạn có bộ nhớ trên 1GB, lxml, pyxml hoặc một số thư viện khác e sẽ ổn cho các tệp 200mb.

1

Để xử lý RDF bằng Python, hãy xem xét sử dụng thư viện RDF như RDFLib. Nếu bạn cũng cần một bộ ba, nhiều giải pháp nặng hơn cũng có sẵn, nhưng có thể không cần thiết ở đây (PySesame, neo4jrdf với neo4jpy).

Trước khi viết phân tích cú pháp SAX của riêng bạn cho RDF, hãy kiểm tra rdfxml.py:

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

Làm cách nào để nhập rdfxml? nó nói đổi tên tham chiếu –

8

Tôi thứ hai là đề xuất bạn thử dùng rdflib.Đó là mẫu thử tốt đẹp và nhanh chóng, và cửa hàng phụ trợ BerkeleyDB quy mô khá tốt vào hàng triệu bộ ba nếu bạn không muốn tải toàn bộ biểu đồ vào bộ nhớ.

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