Re: Non-trivial trading flows with schema.org

Hi,

An update to the problem that schema.org has no http://schema.org/order
property. Yesterday evening it dawned on me that this is not entirely
true, see below.

Am 21.02.2015 um 16:18 schrieb Dietrich Schulten:

> 
> {
>   "@context": {
>     "@vocab": "http://schema.org",
>     "hydra": "http://www.w3.org/ns/hydra/core#",
>     "hydra:property": { "@type": "@vocab"}
>   }
>   "@type": "CafeOrCoffeeShop",
>   "@id": "http://example.com/store",
>   "name": "Kaffeehaus Hagen",
>   "makesOffer": [
>   {
>     "@type": "Offer",
>     "@id": "http://example.com/offers/1234",
>     "itemOffered":
>     {
>       "@type": "Product",
>       "@id": "http://example.com/products/latte",
>       "name": "Latte Macchiato",
>       "hydra:collection": {
>         "@id": "http://example.com/orders"
>         "hydra:operation" : {
>           "hydra:method": "POST",
>           "@type": "OrderAction",
>           "hydra:expects":
>           {
>             "@type": "Product",
>             "hydra:supportedProperty": [
>             {
>               "hydra:property": "name",
>               "hydra:required": true,
>               "defaultValue": "Latte Macchiato",
>               "readOnlyValue": true
>             }
>             ]
>           },
>           "hydra:returns": "Order"
>         }
>       }
>     },
>     "price": 2.8,
>     "priceCurrency": "EUR",
>   }]
> }
> 

What we need is a relationship between the product and orders where the
product may occur. Such a relationship exists

http://schema.org/orderedItem.

This property loosely states that it might occur on
http://schema.org/Order (domainIncludes) and that its values might be of
type http://schema.org/Product (rangeIncludes).

The only issue is that the domain is wrong, i.e. :orderedItem is
supposed to appear as a property of an :Order, however, we need it on a
:Product. But that is not a problem at all, we can simply reverse domain
and range with json-ld, as shown in the @context of the updated version
of the coffeeshop below. No need to apply hydra:collection, we can just
invent a term "orders" and say that it is the reverse of :orderedItem.

One caveat: the property :orderedItem loosely relates a :Product to an
:Order. With schema.org that is not a strict relation, so one could in
fact use our "orders" term on a customer without entailing that the
customer is also a product. But if a property is defined with rdfs:range
and rdfs:domain you need to be careful where you use it, be it reverted
or not.

{
  "@context": {
    "@vocab": "http://schema.org/",
    "hydra": "http://www.w3.org/ns/hydra/core#",
    "hydra:property": { "@type": "@vocab"},
    "orders": {"@reverse": "orderedItem"}
  },
  "@type": "CafeOrCoffeeShop",
  "@id": "http://example.com/store",
  "name": "Kaffeehaus Hagen",
  "makesOffer": [
    {
      "@type": "Offer",
      "@id": "http://example.com/offers/1234",
      "itemOffered":
      {
        "@type": "Product",
        "@id": "http://example.com/products/latte",
        "name": "Latte Macchiato",
        "orders": {
          "@id": "http://example.com/orders",
          "hydra:operation" : {
            "hydra:method": "POST",
            "@type": "OrderAction",
            "hydra:expects":
            {
              "@type": "Product",
              "hydra:supportedProperty": [
                {
                  "hydra:property": "name",
                  "hydra:required": true,
                  "defaultValue": "Latte Macchiato",
                  "readOnlyValue": true
                }
              ]
            },
            "hydra:returns": "Order"
          }
        }
      },
      "price": 2.8,
      "priceCurrency": "EUR",
      "addOn": [
        {
          "@type": "Offer",
          "itemOffered":
          {
            "@type": "Product",
            "name": "shot"
          },
          "price": 0.2,
          "priceCurrency": "EUR"
        }
      ]
    }]
}

Best regards,
Dietrich

Received on Sunday, 22 February 2015 08:41:43 UTC