用Python读取Turtle/N3 RDF文件

8 投票
1 回答
10035 浏览
提问于 2025-04-16 03:13

我正在尝试用Turtle格式来编码一些植物数据,然后用RDFLib从Python中读取这些数据。不过,我遇到了一些问题,不确定是我的Turtle格式有问题,还是我在错误使用了RDFLib。

我的测试数据是:

@PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@PREFIX p: <http://www.myplantdomain.com/plant/description> .
p:description a rdfs:Property .
p:name a rdfs:Property .
p:language a rdfs:Property .
p:value a rdfs:Property .
p:gender a rdfs:Property .
p:inforescence a rdfs:Property .
p:color a rdfs:Property .
p:sense a rdfs:Property .
p:type a rdfs:Property .
p:fruit a rdfs:Property .
p:flower a rdfs:Property .
p:dataSource a rdfs:Property .
p:degree a rdfs:Property .
p:date a rdfs:Property .
p:person a rdfs:Property .
p:c2a7b9a3-c54a-41f5-a3b2-155351b3590f
    p:description [
        p:name [
            p:kingdom "Plantae" ;
            p:division "Pinophyta" ;
            p:class "Pinopsida" ;
            p:order "Pinales" ;
            p:family "Pinaceae" ;
            p:genus "Abies" ;
            p:species "A. alba" ;
            p:language "latin" ;
            p:given_by [
                p:person p:source/Philip_Miller ;
                p:start_date "1923-1-2"^^<http://www.w3.org/2001/XMLSchema#date>
            ]
        ] ;
        p:name [
            p:language "english" ;
            p:value "silver fir"
        ] ;
        p:flower [
            p:gender "male"@en ;
            p:inflorescence "catkin"@en ;
            p:color "brown"@en ;
            p:color "yellow"@en ;
            p:sense "straight"@en
        ] ;
        p:flower [
            p:gender "female"@en ;
            p:inflorescence "catkin"@en ;
            p:color "pink"@en ;
            p:color "yellow"@en ;
            p:sense "straight"@en
        ] ;
        p:fruit [
            p:type "cone"@en ;
            p:color "brown"@en
        ]
    ] .

而我的Python代码是:

import rdflib
g = rdflib.Graph()
#result = g.parse('trees.ttl') 
#result = g.parse('trees.ttl', format='ttl')
result = g.parse('trees.ttl', format='n3')
print len(g)
for stmt in g:
    print stmt

这让我遇到了以下错误:

ValueError: Found @PREFIX when expecting a http://www.w3.org/2000/10/swap/grammar/n3#document . todoStack=[['http://www.w3.org/2000/10/swap/grammar/n3#document', []]]

我尝试过改变parse()函数的参数,但每次都出现错误。我找到的关于如何解析Turtle的例子几乎没有。我到底哪里做错了呢?

1 个回答

10

我觉得第一个问题出在大写的 PREFIX 上——如果把它改成小写,就能通过这个检查了。不太确定这是rdflib的一个bug,还是Turtle的 .ttl 文件的问题,不过在线的 Turtle验证器似乎也认为这是 .ttl 的问题(它显示 验证失败:不支持@PREFIX指令,行1 列0。,但如果你把它改成小写,这个问题就消失了)。

一旦你解决了这个问题,两个解析器都不喜欢 p:given_by [ 这一部分:rdflib说是“语法错误(预期']')在:”...而Turtle验证器则表示

Validation failed: Expecting a period, semicolon, comma, close-bracket, or close-brace but found '/', line 31 col 33.

所以它特别不喜欢 p:source/Philip_Miller 这一部分。

根据这两个问题(谁知道还有没有其他问题...!),我觉得你可以得出结论,这个N3源(你发布的 .ttl 文件)是有问题的,接下来应该关注一下最初是哪个系统生成了这个文件,以及为什么它会以这么多错误的方式生成。

撰写回答