如何解析.ttl文件与RDFLib?(How to parse .ttl files with RD

2019-08-17 06:42发布

我有一个文件.ttl形式。 它有4个属性/列含有四倍以下形式的:

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

我知道如何解析.n3形式RDFLib三倍;

from rdflib import Graph
g = Graph()
g.parse("demo.nt", format="nt")

但我不知道对如何分析这些四倍。

我的目的是分析和提取所有属于一个特定的ID信息。 该ID可以是相同的无论是学生和教师。

如何使用RDFLib处理这些四倍,并使用它基于聚集id

例如,从片断.ttl文件:

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

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

Answer 1:

龟的一个子集Notation 3的语法,从而rdflib应该能够使用解析它format='n3' 。 检查是否rdflib保留意见( id s的在评论(指定#...您的样品中))。 如果不是,如图所示在你的榜样,那么你可以手动解析它的输入格式很简单:

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'))))

输出:

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

为了条目保存到数据库:

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'))

要通过ID组,如果你需要在Python一些后处理:

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))))

输出:

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


Answer 2:

似乎目前还没有这样的库现在来解析龟-简洁RDF三元语言

正如你已经知道的语法,你最好的办法是使用PyParsing首先创建一个语法,然后分析该文件。

我还建议,以适应下面的EBNF实现您的需求,



Answer 3:

你可以做蛇和咖啡建议,仅在包装与产量语句一个循环函数(或它的代码)。 这将创建一个生成器,它可以反复被要求即时创建下一行的类型的字典。 假设你要写下这些为csv,例如,使用蛇parse_to_dict:

import re
import csv

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

您可以创建一个生成的函数或内嵌的理解:

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

- 要么 -

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

这是几乎等同的。 此时你可以通过调用得到的字典解析的线dict_generator.next()你会神奇地得到一个在涉及到时间没有额外的RAM抖动。

如果你有原始数据的16场演唱会,你可能会考虑发电机拉的线,太。 他们是真正有用的。

:从SO发电机和某些文档更多信息,你可以使用哪些Python的发电机功能? http://wiki.python.org/moin/Generators



文章来源: How to parse .ttl files with RDFLib?