【问题标题】:How do I relate Job (jobTitle) to Organization (worksFor) in Schema.org markup?如何在 Schema.org 标记中将工作 (jobTitle) 与组织 (worksFor) 相关联?
【发布时间】:2016-08-24 16:07:10
【问题描述】:

在Person 架构下,我想将每个职位与其各自的组织相关联。这是在一个类似简历的环境中,所以有很多工作和很多组织。

这是我项目中一些代码的实际示例(内容被剪辑+更改):

<div itemscope itemtype="http://schema.org/Person">
  …
  <p><!--list of jobs-->
    <span itemprop="jobTitle">Job 1</span>, 
    <span itemprop="jobTitle">Job 2</span>, and 
    <span itemprop="jobTitle">Job 3</span>
  </p>
  <p><!--list of places worked for-->
    <span itemprop="worksFor">Company A</span> and
    <span itemprop="worksFor">Company B</span>
  </p>
</div>

这会从https://search.google.com/structured-data/testing-tool/ 返回类似这样的架构:

@type   Person
jobTitle    Job 1
jobTitle    Job 2
jobTitle    Job 3
worksFor    
    @type   Organization
    name    Company A
worksFor    
    @type   Organization
    name    Company B

假设我希望职位 1 和 2 成为公司 A 的一部分,而职位 3 成为公司 B 的一部分。我将如何表达它以使其在架构中具有清晰的层次结构?

我知道我可以选择itemref(来自How do I relate items in schema.org? 之类的问题),但我不知道如何设计一种方法来使jobTitle 引用Organization (worksFor)。

【问题讨论】:

  • 我可以向您展示如何在 JSON-LD 中执行此操作。如果您需要微数据,则需要对其进行转换。这可以接受吗?
  • @JayGray 如果你能试一试,那就太好了!在这一点上,有总比没有好,我真的被困在这里了。

标签: html schema.org microdata


【解决方案1】:

我认为这不会发生在 Schema 和 Google(或至少是结构化数据工具)如何解释它之间。我可能是错的,但我认为问题在于jobTitle 和worksFor 都适用于person。所以谷歌会将这两个属性与人相关联,但不一定将这两个属性相互关联。

也可能是我的方法中遗漏了一些东西,而这实际上是可能的。我想发布我的答案,以至少引导您或具有更好经验的人朝着正确的方向前进(或证实我的怀疑)。我有两种方法,我相信 Microdata 方法在工具中看起来是正确的,但是是错误的。我认为 JSON-LD 方法是正确的,但在结构化数据工具中显示不正确。

微数据方法

如果您可以在一定程度上修改 DOM,则可以使用元标记将组织嵌套在人员中。尽管结构化数据工具显示了我认为您想要的结果,但我不相信数据会真正相关,因为员工并没有真正附加到 id:

<div itemscope itemtype="http://schema.org/Person" id="person1">
  <p><!--list of jobs-->
    <span>Job 1</span>, 
    <span>Job 2</span>, and 
    <span>Job 3</span>
  </p>
  <p><!--list of places worked for-->
    <span itemscope itemprop="worksFor" itemtype="http://schema.org/Organization">
        <span itemprop="name">Company A</span>
        <span itemscope itemprop="employee" itemref="person1" itemtype="http://schema.org/Person">
            <meta itemprop="jobTitle" content="Job 1">
        </span>
    </span> and
    <span itemscope itemprop="worksFor" itemtype="http://schema.org/Organization">
        <span itemprop="name">Company B</span>
        <span itemscope itemprop="employee" itemref="person1" itemtype="http://schema.org/Person">
            <meta itemprop="jobTitle" content="Job 2">
            <meta itemprop="jobTitle" content="Job 3">
        </span>
    </span>
  </p>
</div>

返回:

@type = Person

worksFor    
    @type = Organization
    name = Company A

    employee    
        @type = Person
        jobTitle = Job 1

worksFor    
    @type = Organization
    name = Company B

    employee    
        @type = Person
        jobTitle = Job 2
        jobTitle = Job 3

我通过嵌套Person > Organization > Employee (Person) > JobTitle 来解决这个问题。我为员工添加了一个带有元标记的空白跨度,这样您就可以保持相同的前端样式。

我对这种方法的担忧是每个Organization 下的Employee 将与父Person 断开连接。我在父级上使用了一个 id,并在每个 Employee 中使用 itemref 来指向该父级 id,但我不确定这是否真的受支持,或者嵌套是否足够(值得怀疑)。

JSON-LD 方法

我认为 JSON-LD 方法正确地将人与组织相关联,但谷歌的工具最终会将jobTitle 推回给基本上给你相同结果的人。不过可能有更好的方法来关联数据。

<script type="application/ld+json">
      {
        "@context": {
            "@vocab": "http://schema.org/",
            "id": "@id",
            "graph": "@graph",
            "type": "@type"
        },
        "graph" : [
            {
                "type": "Person",
                "id": "Person1",
                "name": "John Smith",
                "worksFor" : [
                    {
                        "id": "CompanyA"
                    }, 
                    {
                        "id": "CompanyB"
                    }
                ]
            }, 
            {
                "type": "Organization",
                "id": "CompanyA",
                "name": "Company A",
                "employees": [
                    {
                        "@id" : "Person1",
                        "jobTitle" : ["Job 1", "Job 2"]
                    }
                ]
            }, 
            {
                "type": "Organization",
                "id": "CompanyB",
                "name": "Company B",
                "employees": [
                    {
                        "@id" : "Person1",
                        "jobTitle" : "Job 3"
                    }
                ]
            }
        ]
      }
</script>

不幸的是:

@type : http://www.example.com/Person
@id : http://www.example.com/Person1
name : John Smith
jobTitle : Job 1
jobTitle : Job 2
jobTitle : Job 3

worksFor    
    @type : http://www.example.com/Organization
    @id : http://www.example.com/CompanyA
    name : Company A

worksFor    
    @type : http://www.example.com/Organization
    @id : http://www.example.com/CompanyB
    name : Company B

虽然结构化数据工具以一种看起来正确的方式和一种看起来错误但似乎正确的方式提供了上述一个选项,但很难说 Google 是如何真正关联数据的。也可能只是模式/数据工具在更基本的层次上假设关系,通常有人不会在多个组织中拥有多个职位......但我只是在推测这一点。

底线是 - 我觉得问题是Organization 只能在person 下列为worksFor。 jobTitle 只能在person 之下,而不能在Organization 之下。您可以将Organization 下的Person 关联为employee,但这似乎只是在结构化数据工具中将jobTitle 匿名推回相关的person。过去,结构化数据工具已知有一些针对 Google 文档的缺陷,因此我不确定您不能 100% 依赖您从中看到的内容。

【讨论】:

    【解决方案2】:

    在我的在线简历中努力将工作与公司联系起来之后,我实现了一些看起来像这样的东西。

    供参考:schema.org OrganizationRole

    <div itemscope itemtype="https://schema.org/Person">
      <div itemprop="worksFor" itemscope itemtype="https://schema.org/EmployeeRole">
        <div itemprop="worksFor" itemscope itemtype="https://schema.org/Corporation">
          <span itemprop="name">[COMPANY]</span>
        </div>
        <span itemprop="roleName">[JOB]</span>
      </div>
      <p itemprop="name">[NAME]</p>
    </div>
    

    您可以测试您的微数据here (google Structured Data Testing Tool)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      相关资源
      最近更新 更多