[whatwg] inverse property mechanism for Microdata?

Dan Brickley danbri at google.com
Mon Mar 17 13:00:42 PDT 2014


Hi Ian, HTML people,

On 31 January 2014 23:45, Ian Hickson <ian at hixie.ch> wrote:
> On Fri, 31 Jan 2014, Dan Brickley wrote:
>>
>> We'd (schema.org 'we') like to make a public proposal to update
>> Microdata with a syntax for expressing inverse properties/relationships.
>> [...]
>>
>> Here's an example with 'containedIn'. The idea is that we want to
>> express that the LocalBusiness (i.e. Place) Entity B is 'containedIn'
>> Entity A. The example I show here expresses the reverse, incorrectly. So
>> we're looking for a change to the markup that would turn this example
>> into one that said "The LocalBusiness Entity B is containedIn the
>> LocalBusiness Entity A":
>>
>> <div itemscope itemtype="http://schema.org/LocalBusiness">
>>   <h1><span itemprop="name">(Entity A) Beachwalk Beachwear &
>>   Giftware</span></h1>
>>   <span itemprop="description"> A superb collection of fine gifts and clothing
>>   to accent your stay in Mexico Beach.</span>
>>   Phone: <span itemprop="telephone">850-648-4200</span>
>>
>>   <div itemprop="containedIn" itemscope
>>        itemtype="http://schema.org/LocalBusiness">
>>     <h2><span itemprop="name">(Entity B) The tiny store within a
>>     store</span></h2>
>>     <span itemprop="description"> A superb collection of tiny clothes,
>>     from the store within the store.</span>
>>     Phone: <span itemprop="telephone">123-456-7890</span>
>>   </div>
>>
>> </div>
>
> This is actually possible today:
>
>  <div itemscope itemtype="http://schema.org/LocalBusiness"
>       id=a itemprop="containedIn">
>    <h1><span itemprop="name">(Entity A) Beachwalk Beachwear &
>    Giftware</span></h1>
>    <span itemprop="description"> A superb collection of fine gifts and clothing
>    to accent your stay in Mexico Beach.</span>
>    Phone: <span itemprop="telephone">850-648-4200</span>
>
>    <div itemscope itemref=a itemtype="http://schema.org/LocalBusiness">
>      <h2><span itemprop="name">(Entity B) The tiny store within a
>      store</span></h2>
>      <span itemprop="description"> A superb collection of tiny clothes,
>      from the store within the store.</span>
>      Phone: <span itemprop="telephone">123-456-7890</span>
>    </div>
>
>  </div>
>
> The trick here is to turn the inner item into the top-level microdata
> item, and use itemref="" to have that inner item point to the outer item.

You're right; it is indeed possible. However it is perhaps a little
too clever. I've tried it on a few colleagues, and it didn't 'click'
with anyone yet.

We discussed this (and the -inv suggestion) at schema.org again, and
the consensus there was that we'd like to have the search engines
proceed with accepting an experimental/proposed 'inverse itemprop'
attribute, rather than work around its absence.


> (This works great unless you want two items to refer to the same third
> item using different properties, but that's something microdata can't do
> in general, since it's based on a tree structure, not a graph structure.
> To address that particular problem, you need a vocabulary that defines
> how itemid="" works; at that point, you can just have the same underlying
> item represented as multiple microdata items in the document by having all
> the items share the same ID. But how exactly that is to be interpreted is
> something the vocabulary has to define.)
>
>> One response is that the markup could be reorganized.
>
> That's basically what the above does, but without moving the elements
> around in the DOM. (itemref="" is basically all about making the microdata
> model work around constraints coming from the author's preferred DOM.)

(Yup.)


>> Another reasonable response to this is 'well, perhaps you should have a
>> property (instead or in addition) called "geospatiallyContains", or
>> "containerOf" or "contains", or "rev_containedIn" for this usage
>> scenario'?
>
> That is another option, similar to the parenthetical itemid="" note above
> -- you could just have the vocabulary define that for every property whose
> value is an item, the item type that that property can point to has
> another property with the same name plus a fixed suffix, like "-inv", that
> inverses the relationship. That would make the above look like:
>
>  <div itemscope itemtype="http://schema.org/LocalBusiness">
>    <h1><span itemprop="name">(Entity A) Beachwalk Beachwear &
>    Giftware</span></h1>
>    <span itemprop="description"> A superb collection of fine gifts and clothing
>    to accent your stay in Mexico Beach.</span>
>    Phone: <span itemprop="telephone">850-648-4200</span>
>
>    <div itemprop="containedIn-inv"
>         itemscope itemtype="http://schema.org/LocalBusiness">
>      <h2><span itemprop="name">(Entity B) The tiny store within a
>      store</span></h2>
>      <span itemprop="description"> A superb collection of tiny clothes,
>      from the store within the store.</span>
>      Phone: <span itemprop="telephone">123-456-7890</span>
>    </div>
>  </div>

This is easier to understand than itemref, but still involves creating
100s of additional properties instead of just one new piece of syntax.

>> We have tried this and in a few cases we have included pairs of inverse
>> properties in schema.org, e.g. we have "alumni" and an inverse,
>> "alumniOf".  In designing schemas we have found it consistently hard to
>> get even a single natural/intuitive name for each property, and finding
>> a good name for the inverse of each makes the task even heavier.
>> Appending "Of" (or other fixed suffix) doesn't always work well; e.g.
>> "containedIn" / "containedInOf" barely makes sense.
>
> Yeah, you'd have to just pick a suffix like "-inv" or a prefix like "rev-"
> or something that doesn't attempt to give a good English meaning. The
> advantage of doing that is that you could then define this for the
> vocabulary generically, and process it generically, rather than having to
> actually define and support each individual property.

That's the motivation for asking for an inverse itemprop syntax; it
could be used to process data for all vocabularies generically without
introducing hundreds of unwanted new properties. We'd like to avoid
things like "alumni-inv" leaking into JSON-LD usage, since JSON-LD has
an inverse property notation that can be used directly with the
"alumni" property.

Would a data- attribute be an appropriate way to indicate an
experimental/proposed attribute? And then if it works out well perhaps
a real microdata attribute could be added later? e.g.
data-itemprop-inverse="alumni" ...

Dan

> HTH,
> --
> Ian Hickson               U+1047E                )\._.,--....,'``.    fL
> http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
> Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'



More information about the whatwg mailing list