最佳JSON-LD做法:使用多个<script>元素?


71

我很好奇将JSON-LD应用于schema.org网站的最佳实践。

如果我有一个带有的页面,Article并且我也想WebSite在页面上进行定义,则需要这样:

<script type="application/ld+json">
{
    "@context": "http://schema.org",
    "@type": "WebSite",
    "url": "http://www.example.com/",
    "potentialAction": {
      "@type": "SearchAction",
      "target": "http://www.example.com/search?&q={query}",
      "query-input": "required"
    }
}
</script>

<!- … -->

<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "Article",
  "author": "John Doe",
  "interactionCount": [
    "UserTweets:1203",
    "UserComments:78"
  ],
  "name": "How to Tie a Reef Knot"
}
</script>

这是正确还是错误?是否有任何好处或需要将它们合并到相同的脚本或项目数组中?


1
阅读此w3.org/TR/json-ld/#h3_advanced-context-usage,只需使用一个简单列表即可
hsrv

Answers:


52

没错 您可以根据需要拥有任意数量的数据块(=script元素)。

仅使用一个script元素的可能好处:它使多个项目之间的关系更容易(例如,您是否应该决定使用hasPartmainEntity),因为您只需嵌套项目即可。
但是,当使用单独的数据块时,通过使用@id感谢@ Gregg Kellogg)引用项目的URI,当然也可以建立这些关系。

(作为参考,在一个单一的添加两种以上顶级项目script是可能的@graph。)


8
您还可以使用@id将JSON-LD脚本块中的节点绑定在一起。从模型的角度来看,它们在同一个图中都被视为三元组。但是,搜索引擎可能会“优化”,而不是您期望的那样。使用JSON-LD算法可能没有充分的理由使用单独的脚本块。只需将它们合并为一个公共对象,甚至是对象数组。
Gregg Kellogg 2015年

@GreggKellogg和Unor-感谢您的回答!我主要关心的是CMS的局限性,因为WebSite是我要在全局级别指定的,而Article是在页面级别指定的。我不太确定在这种情况下会发生什么。Google的结构化数据工具对此还算不错,但我一直对此持怀疑态度:)
Stu Furlong 2015年

@GreggKellogg现在是2017年,现在是推荐@graph还是一系列对象?相关讨论在2012年完成(github.com/json-ld/json-ld.org/issues/96),根据我的阅读,共识是@graph针对多个顶级对象。提前致谢。
阿米尔·鲁斯塔姆扎德

1
@AmirR通常,您将使用@graph(或的别名@graph)允许在共享上下文中使用单个顶级对象。两者都是相当合法的。请注意,另一种模式是使用反向属性,该属性的公共对象值用作顶级对象,并链接到引用该对象的所有资源。请参见反向属性
Gregg Kellogg

57

除了限制如何在网站中存储和管理架构数据之外,拥有单个或多个数据块没有任何好处。

例如,如果您网站中的不同组件负责独立生成每个数据块,则可能需要将它们分开。另外,如果您的网站能够在一处管理一个页面的所有架构,则管理单个数据块并将其呈现为单个script元素可能会更简单。

您可以通过将每个模式作为数组列出来将它们组合成一个脚本,如下所示:

<script type="application/ld+json">
[
  {
    "@context": "http://schema.org",
    "@type": "WebSite",
    "url": "http://www.example.com/",
    "potentialAction": {
      "@type": "SearchAction",
      "target": "http://www.example.com/search?&q={query}",
      "query-input": "required"
    }
  },
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "author": "John Doe",
    "interactionCount": [
      "UserTweets:1203",
      "UserComments:78"
    ],
    "name": "How to Tie a Reef Knot"
  }
]
</script>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.