如何在JSON-LD框架中结合@reverse与@embed:@never并保留无broader概念
解决SKOS JSON-LD框架保留所有概念并排除broader嵌入的问题
问题出在哪
你用@reverse加"@embed": "@never"时,JSON-LD处理器只会认那些通过broader反向关联到ConceptScheme的概念——也就是带broader的那两个。没broader的概念因为没这个反向关联,直接被过滤了。这是@reverse和@embed交互的正常行为,但刚好和你要的效果相反。
怎么改才能达到目的
要同时满足「ConceptScheme在顶层、所有4个概念都保留、broader不嵌入」,得把“包含所有概念”和“控制broader不嵌入”这俩逻辑分开:
- 先明确指定所有
skos:Concept类型的资源都要被包含在ConceptScheme下,比如用skos:concept或skos:hasTopConcept属性 - 单独给
broader属性设置"@embed": "@never",只阻止它嵌入关联资源,别用它来过滤概念
给你两个可行的框架示例:
示例1:用skos:hasTopConcept关联概念
{ "@context": "http://schema.org", "@type": "skos:ConceptScheme", "skos:hasTopConcept": { "@type": "skos:Concept", "@embed": "@always", "broader": { "@embed": "@never" } } }
示例2:直接指定Concept类型的包含规则
{ "@context": "http://schema.org", "@type": "skos:ConceptScheme", "@reverse": { "broader": { "@embed": "@never" } }, "skos:concept": { "@type": "skos:Concept", "@embed": "@always" } }
核心逻辑就是:别让@reverse里的规则决定哪些概念被包含,而是单独用属性(比如skos:concept)把所有概念都拉进来,再单独控制broader不嵌入。
关于@embed": "@never"在@reverse块的生效问题
它确实会生效,但作用是阻止反向关联的资源被嵌入,不是强制包含所有资源。你之前只在@reverse块里定义了broader的规则,处理器就只会处理有这个反向关联的概念,没关联的自然被排除——这是处理器按规则匹配资源的正常逻辑,不是bug。
内容的提问来源于stack exchange,提问作者ThomasFrancart
相关产品推荐
相关产品推荐

