JSON-LD中@id是否需全局唯一?URI解析责任归属?
问题
JSON-LD的提供者是否必须确保节点的@id始终全局唯一,还是仅需在单个JSON-LD文档内保持唯一?
示例场景
假设不同网站上有两篇均采用CC-BY-SA 4.0许可的文章,它们使用schema.org结合JSON-LD描述元数据。其中一篇文章使用URI http://creativecommons.org/licenses/by-sa/4.0/,另一篇使用https://creativecommons.org/licenses/by-sa/4.0/deed.en作为license属性的@id。
文章A的JSON-LD
{ "@context": "https://schema.org/", "@type": "Article", "name": "A", "url": "https://a.com/article", "license": { "@id": "http://creativecommons.org/licenses/by-sa/4.0/" } }
文章B的JSON-LD
{ "@context": "https://schema.org/", "@type": "Article", "name": "B", "url": "https://b.com/article", "license": { "@id": "https://creativecommons.org/licenses/by-sa/4.0/deed.en" } }
使用schema.org验证器检查这两个许可URI时,得到以下结果:
{ "@id": "https://creativecommons.org/licenses/by-sa/4.0/deed.id" }
衍生问题:两篇文章的license属性指向的是同一个还是不同的JSON-LD节点?将不同URI解析为全局唯一标识符的工作应由元数据的消费者还是提供者负责?
(虽知晓双方尽量将不同URI解析为全局唯一标识符是最佳实践,但想了解规范对此示例的具体界定)
解答
1. @id的唯一性规范要求
根据JSON-LD核心规范,@id的本质是全局唯一标识符,而非仅单文档内的唯一标识。规范明确要求,若不同文档中的节点指向Web上的同一实体,必须使用相同的@id值,这样才能保证跨文档的实体合并、关联识别是准确的。仅在单文档内唯一的@id不符合JSON-LD的设计初衷。
2. 示例中的节点判定
从JSON-LD规范的严格定义来看,示例中两篇文章的license是不同的JSON-LD节点——因为它们的@id值是不同的URI。尽管这两个URI实际指向同一许可实体,但JSON-LD规范不会自动将不同URI视为同一实体,除非通过owl:sameAs这类专门的等价关联词汇明确声明两者指向同一实体。
你提到的schema.org验证器返回统一的deed.id,这是schema.org生态的附加归一化处理,不属于JSON-LD核心规范的强制要求。
3. URI归一化的责任划分
- 提供者责任:规范建议提供者应当使用权威、标准的全局唯一URI作为
@id,避免为同一实体使用不同URI,这是保证元数据互操作性的最佳实践。比如对于CC-BY-SA 4.0许可,应使用其官方指定的标准URI。 - 消费者责任:如果需要处理不同URI指向同一实体的场景,消费者可以自行实现URI归一化(如解析重定向、识别等价声明),但这并非JSON-LD规范强制要求的行为。规范仅要求消费者将相同
@id视为同一实体,不同@id默认视为不同实体。
内容的提问来源于stack exchange,提问作者Stephan Kulla

