2013-03-02 19 views
7

.ttl formunda bir dosya var. Aşağıdaki form dörtlü içeren 4 öznitelikleri/sütunları vardır:RDFLib ile .ttl dosyaları nasıl ayrıştırılır?

  1. (id, student_name, student_address, student_phoneno).
  2. (id, faculty_name, faculty_address, faculty_phoneno).

RDFLib ile .n3 form üçlüsünü nasıl ayrıştırılacağını biliyorum; Bu dörtgrupları nasıl ayrıştırılacağından emin değilim.

Amacım belirli bir kimliğe ait tüm bilgileri ayrıştırmak ve ayıklamaktır. Kimlik hem öğrenci hem de öğretim üyeleri için aynı olabilir.

Bu dörtgrupları işlemek ve id tabanlı toplama için kullanmak için RDFLib'i nasıl kullanabilirim? İlk PyParsing için kullanmak

#@ <id1> 
<Alice> <USA> <12345> 

#@ <id1> 
<Jane> <France> <78900> 
+0

söz konusu etiketi ile başvurulan aynı başvurulan 'ttl' mı? –

+0

TTL formu nedir? –

+1

Sanırım [Turtle - Terse RDF Üçlü Dil] (http://www.w3.org/TeamSubmission/turtle/) – Abhijit

cevap

0

O zaten dilbilgisi bildiği gibi Turtle - Terse RDF Triple Language

ayrıştırmak için böyle bir kütüphane mevcut şu anda var gibi görünüyor, en iyi bahis:

Örnek .ttl dosyadan pasajı Bir dilbilgisi oluşturun ve sonra dosyayı ayrıştırın.

Ben de sadece verim ifadeleri içeren bir döngü içinde bu işlevi (veya kod) sarın, sizin ihtiyaç

0

Sen Yılanlar olarak yapabileceği ve Kahve anlaşılacağı üzere aşağıdaki EBNF implementation adapte öneririm. Bu, bir sonraki çizginin vuruşlarını anında oluşturmak için iteratif olarak çağrılabilen bir jeneratör yaratır.

def dict_generator(lines): 
    for line in lines: 
     yield parse_to_dict(line) 

OR: Sen bir fonksiyonu olarak veya bir satır içi anlayışı ile bir jeneratör oluşturabilir

import re 
import csv 

writer = csv.DictWriter(open(outfile, "wb"), fieldnames=["id", "name", "address", "phone"]) 
# or whatever 

: Eğer Yılanların parse_to_dict kullanarak, örneğin, bir csv bu yazmak için gittiğini varsayarsak -

dict_generator = (parse_to_dict(line) for line in lines) 

Bunlar hemen hemen eşdeğerdir. Bu noktada, dict_generator.next() numaralı telefonu arayarak dict-ayrıştırılmış bir satır elde edebilirsiniz ve bir kerede bir tane olsun, hiç bir RAM atlatma işlemi gerçekleştirmeyeceksiniz.

16 g ham veriye sahipseniz, satırları da çekmek için bir jeneratör oluşturmayı düşünebilirsiniz. Gerçekten işe yarıyorlar. SO jeneratörler de ve bazı dokümanlar üzerinde

diğer bilgiler: What can you use Python generator functions for? http://wiki.python.org/moin/Generators

+0

Yılanlar ve kahve..parse_to_dict çizgisi yok ve bu çizginin ne yapmak istediğini unuttum –

6

TurtleNotation 3 sözdizimi bir alt kümesi böylece rdflibformat='n3' kullanarak ayrıştırmak gerekir olduğunu. rdflib yorumlarının korunup korunmadığını kontrol edin (id s, yorumunuzda (#...) belirtilmiştir).Değilse ve örnekte görüldüğü sonra bunu elle ayrıştırmak olabilir gibi giriş biçimi olarak basittir:

import re 
from collections import namedtuple 
from itertools import takewhile 

Entry = namedtuple('Entry', 'id name address phone') 

def get_entries(path): 
    with open(path) as file: 
     # an entry starts with `#@` line and ends with a blank line 
     for line in file: 
      if line.startswith('#@'): 
       buf = [line] 
       buf.extend(takewhile(str.strip, file)) # read until blank line 
       yield Entry(*re.findall(r'<([^>]+)>', ''.join(buf))) 

print("\n".join(map(str, get_entries('example.ttl')))) 

Çıktı:

Entry(id='id1', name='Alice', address='USA', phone='12345') 
Entry(id='id1', name='Jane', address='France', phone='78900') 

bir db girişleri kaydetmek için:

import sqlite3 

with sqlite3.connect('example.db') as conn: 
    conn.execute('''CREATE TABLE IF NOT EXISTS entries 
      (id text, name text, address text, phone text)''') 
    conn.executemany('INSERT INTO entries VALUES (?,?,?,?)', 
        get_entries('example.ttl')) 

Python'da bazı sonradan işlemeye gerek duyarsanız, kimliğe göre gruplandırmak için:

import sqlite3 
from itertools import groupby 
from operator import itemgetter 

with sqlite3.connect('example.db') as c: 
    rows = c.execute('SELECT * FROM entries ORDER BY id LIMIT ?', (10,)) 
    for id, group in groupby(rows, key=itemgetter(0)): 
     print("%s:\n\t%s" % (id, "\n\t".join(map(str, group)))) 

Çıktı:

id1: 
    ('id1', 'Alice', 'USA', '12345') 
    ('id1', 'Jane', 'France', '78900') 
İlgili konular