You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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处理器,只要遇到关联的节点(不管是空白节点还是其他),都直接把内容嵌入到当前属性值里,而不是拆分成独立的条目。

另外你提到用turtlen3格式时显示正常,那是因为这些格式本身就支持紧凑的空白节点写法,不需要额外配置;但JSON-LD作为结构化的JSON格式,需要通过框架来明确控制输出结构。

备注:内容来源于stack exchange,提问作者Nora

火山引擎 最新活动