我正在尝试将知识图导出为海龟文件,但由于某种原因,我的前缀似乎没有进入海龟文件(或者至少不是全部)。
最小可重现代码(用 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 ;
...
我做错了什么,还是这是一个错误?
如果你修复了双重训练'/',我认为问题就消失了。
改变:
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
海龟语法...)