rdflib 7.1.1 命名空间绑定未在海龟文件中序列化

问题描述 投票:0回答:1

我正在尝试将知识图导出为海龟文件,但由于某种原因,我的前缀似乎没有进入海龟文件(或者至少不是全部)。

最小可重现代码(用 jupyter 笔记本编写,使用 rdflib 7.1.1):

from rdflib import URIRef, Graph, Literal
import itertools

def make_example_IRI(ID_list):
    return URIRef("http://example.org/" + 
                    '/'.join([str(id).lower()
                        for id in ID_list])
                    )

tg = Graph()

tbls = ['A', 'B',]
cols = ['X', 'Y',]
rows = ['i', 'j', 'k']
data = [1,2,3]

label_iri = URIRef('http://www.w3.org/2000/01/rdf-schema#label')

for combo in itertools.product(tbls, rows, cols, data):
    row_iri = make_example_IRI([combo[0], 'row', combo[1]])
    col_iri = make_example_IRI([combo[0], 'col', combo[2]])
    datum = Literal(combo[-1])
    tg.add((row_iri, col_iri, datum))
    tg.add((col_iri, label_iri, Literal(combo[2])))

bind_list = []   
for tab in tbls:
    nsR = (f'tab{tab}', make_example_IRI([tab, 'row', '/']))
    nsC = (f'tab{tab}_col', make_example_IRI([tab, 'col', '/']))
    bind_list.append(nsR)
    bind_list.append(nsC)

for short, long in bind_list:
    tg.bind(short, long, override=True, replace=True)

如果我使用以下命令打印我的命名空间,新绑定的命名空间将显示一长串默认命名空间。

[n for n in tg.namespaces()]

我的命名空间看起来像:

[ ... 
 ('tabA', rdflib.term.URIRef('http://example.org/a/row//')),
 ('tabA_col', rdflib.term.URIRef('http://example.org/a/col//')),
 ('tabB', rdflib.term.URIRef('http://example.org/b/row//')),
 ('tabB_col', rdflib.term.URIRef('http://example.org/b/col//')),
 ('tabC', rdflib.term.URIRef('http://example.org/c/row//')),
 ('tabC_col', rdflib.term.URIRef('http://example.org/c/col//'))]

但是然后运行:

tg.serialize(format="turtle", destination="tg.ttl")

给海龟添加以下前缀:

@prefix ns1: <http://example.org/b/col/> .
@prefix ns2: <http://example.org/a/col/> .
@prefix ns3: <http://example.org/c/col/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

所以它不仅忽略了我尝试绑定的缩短的前缀,而且完全忽略了与“行”相关的项目也应该有前缀。

.ttl 的其余部分看起来像:

ns2:x rdfs:label "X" .

ns2:y rdfs:label "Y" .

ns2:z rdfs:label "Z" .

<http://example.org/a/row/i> ns2:x 1,
        2,
        3 ;
    ns2:y 1,
        2,
        3 ;
    ns2:z 1,
        2,
        3 .

当我期待的时候

tabA:1 tabA_col:x 1,
                  2,
                  3 ;
...

我做错了什么,还是这是一个错误?

python rdflib
1个回答
0
投票

如果你修复了双重训练'/',我认为问题就消失了。

改变:

tg.bind(short, long, override=True, replace=True)

tg.bind(short, long.strip('//') + '/', override=True, replace=True)

然后,使用您的代码,我得到以下前缀:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tabA: <http://example.org/a/row/> .
@prefix tabA_col: <http://example.org/a/col/> .
@prefix tabB: <http://example.org/b/row/> .
@prefix tabB_col: <http://example.org/b/col/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

...海龟文件的其余部分符合预期。

(顺便说一句,使用 longturtle -

tg.serialize(format="longturtle")
- 更现代的
PREFIX
海龟语法...)

© www.soinside.com 2019 - 2024. All rights reserved.