首页 > 解决方案 > 如何通过 rdflib 获取 XML 属性

问题描述

我有一个包含以下内容的 rdf 文件:

<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
    <rdf:Description rdf:about="http://someurl.com/def/elementtype/projectState">
        <rdfs:domain rdf:nodeID="projectState_0" />
    </rdf:Description>
</rdf:RDF>

由以下代码解析:

import rdflib

g = rdflib.Graph()

with open("problem/err.rdf", 'r', encoding='UTF-8') as fp:
    g.load(fp, format='application/rdf+xml')

for s, p, o in g:
    print(f"subject:{s}")
    print(f"predicate:{p}")
    print(f"object:{o}")
    print()

我希望谓词公开属性nodeID,但我没有找到获取它的方法。该文档也不承认 BNodes 上的 xml 属性(没有内容的空白节点)。

标签: rdfrdflibblank-nodes

解决方案


导入图形时,通常不承诺保留空白节点主题(某些图形数据库,如 GraphDB 确实提供选项)。当我第一次运行代码时,输​​出是

subject:http://someurl.com/def/elementtype/projectState
predicate:http://www.w3.org/2000/01/rdf-schema#domain
object:N4ae82de375104726a1a2e5344ee6a44e

当我第二次运行它时,输出是

subject:http://someurl.com/def/elementtype/projectState
predicate:http://www.w3.org/2000/01/rdf-schema#domain
object:N79f7d744f68f439388484f02a9367be5

所以关于暴露nodeId的问题,它只是不尊重你给它的标识符。查看有关问题的更多信息。

我会建议

一世。使用支持空白节点保存的不同图形数据库

ii. 使用 XML 解析器

iii. 将空白节点提升为rdf:resource


推荐阅读