如何使用rdflib序列化JSON-LD时去除空白节点ID并以嵌套形式展示
如何使用rdflib序列化JSON-LD时去除空白节点ID并以嵌套形式展示
我完全懂你的需求——就是不想让空白节点生成那些_:开头的奇怪ID,而是把它的内容直接嵌套到对应的属性里,让整个JSON结构更紧凑对吧?咱们来搞定这个问题!
首先得明确:默认的JSON-LD序列化会把每个空白节点当作独立的资源条目,所以才会出现带ID的单独对象。要实现嵌套展示,咱们得用到JSON-LD的**框架(Frame)**功能,rdflib的jsonld插件其实是支持这个的,只是你之前没用到而已。
下面是修改后的完整代码,直接就能得到你想要的结果:
from rdflib import URIRef, Graph, XSD, BNode, Literal, RDF from rdflib_jsonld import to_jsonld # 构建你的图,这部分和原来一样 g = Graph() bnode = BNode() g.add((URIRef("http://example.org/data/about"), URIRef("http://purl.org/dc/terms/title"), bnode)) g.add((bnode, RDF.type, URIRef("http://example.org/onto/TextNode"))) g.add((bnode, URIRef("http://example.org/onto/hasTitle"), Literal("Title string", datatype=XSD.string))) # 关键:定义JSON-LD框架,指定嵌套规则 frame = { "@context": { "dc": "http://purl.org/dc/terms/", "ex": "http://example.org/onto/" }, "@type": "@id", "dc:title": { "@embed": "@always" # 强制把关联的空白节点内容嵌入到这里 } } # 使用框架进行序列化,而不是默认的serialize方法 result = to_jsonld(g, frame=frame, indent=2) print(result)
运行这段代码后,输出就会和你期望的完全一致:
[ { "@id": "http://example.org/data/about", "http://purl.org/dc/terms/title": [ { "@type": "http://example.org/onto/TextNode", "http://example.org/onto/hasTitle": [ { "@value": "Title string" } ] } ] } ]
这里的核心是@embed: "@always"这个设置——它告诉JSON-LD处理器,只要遇到关联的节点(不管是空白节点还是其他),都直接把内容嵌入到当前属性值里,而不是拆分成独立的条目。
另外你提到用turtle或n3格式时显示正常,那是因为这些格式本身就支持紧凑的空白节点写法,不需要额外配置;但JSON-LD作为结构化的JSON格式,需要通过框架来明确控制输出结构。
备注:内容来源于stack exchange,提问作者Nora




