如何强制rdflib.Dataset中add/parse添加的三元组存入默认图
问题根因
rdflib 中Dataset实例本身不直接对应RDF规范定义的默认图,直接在ds对象上调用add()、parse()方法写入三元组时,框架会自动生成一个以空白节点为标识的匿名图承载这部分数据。后续序列化为n-quads、trig这类带图名的四元组格式时,这个空白节点就会被作为所属图名输出,和默认图无图名的预期不符。
可行方案
所有需要写入默认图的三元组,统一通过ds.default_context属性对应的上下文对象操作即可。这个对象就是rdflib中默认图的实体,写入它的三元组在序列化时不会附带任何图标识,完全符合默认图的规范要求。
修正后的示例代码
from rdflib import Dataset from rdflib.term import URIRef ds = Dataset() # 写入默认图:直接操作default_context对象 ds.default_context.parse(data='<df:s> <df:p> <df:o>.') # 写入命名图'<ng:g>' g = ds.graph(URIRef('ng:g')) g.parse(data='<ng:s> <ng:p> <ng:o>.') ds_nquads = ds.serialize(format='nquads') print(ds_nquads)
预期输出
<ng:s> <ng:p> <ng:o> <ng:g> . <df:s> <df:p> <df:o> .
补充说明
- 用
add()方法写入默认图时,直接调用ds.default_context.add((s,p,o))即可,无需传入第四个图参数。 - 如果习惯直接在
ds对象上调用add()传入四元组,将第四个图位置参数设为ds.default_context.identifier也能实现相同效果,但可读性不如直接操作default_context。
内容的提问来源于stack exchange,提问作者Neil Graham
相关产品推荐
相关产品推荐

