[whatwg] inverse property mechanism for Microdata?
Ian Hickson
ian at hixie.ch
Mon Mar 17 14:15:12 PDT 2014
On Mon, 17 Mar 2014, Dan Brickley wrote:
>
> 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.
So the idea here that the itemprop-up (or whatever -- it would be good to
get a more intuitive name, not sure what to call it though) would have to
be specified in conjunction with the itemscope="" attribute on a top-level
microdata item whose element had an ancestor that itself creates an item,
and would actually specify a property on the inner item, whose value was
the outer item?
This is what the example would look like if I'm understanding this right:
<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 itemscope itemtype="http://schema.org/LocalBusiness"
itemprop-up="containedIn">
<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>
It's not too bad, I guess. My main concern is that this seems to solve a
very narrow use case for non-tree structures, but doesn't take into
account the many, many other non-tree structures. For example, consider
the case of a TV Episode with an Actor:
<div itemscope itemtype="http://schema.org/Episode">
...
<div itemprop="actor"
itemscope itemtype="http://schema.org/Person">
...
</div>
</div>
...now suppose it's marked up the other way around:
<div itemscope itemtype="http://schema.org/Person">
...
<div itemprop-up="actor"
itemscope itemtype="http://schema.org/Episode">
...
</div>
</div>
So far so good. But what if there's two episodes with two actors, and the
page just lists both episodes and both actors, and wants to
cross-reference both episodes to both actors?
itemprop-up (or whatever we call it) can't help there. itemref="" can help
in some simple cases, but as you pointed out, it soon gets out of hand.
Microdata actually already has a solution to this. The vocabulary can
define an ID for each item using itemid="", and can define multiple items
having the same ID as being the same conceptual item. Thus:
<!-- first episode -->
<div itemscope itemtype="http://schema.org/Episode">
...
<div itemprop="actor"
itemscope itemtype="http://schema.org/Person"
itemid="http://.../person/123"></div>
<div itemprop="actor"
itemscope itemtype="http://schema.org/Person"
itemid="http://.../person/456"></div>
</div>
<!-- second episode -->
<div itemscope itemtype="http://schema.org/Episode">
...
<div itemprop="actor"
itemscope itemtype="http://schema.org/Person"
itemid="http://.../person/123"></div>
<div itemprop="actor"
itemscope itemtype="http://schema.org/Person"
itemid="http://.../person/456"></div>
</div>
<!-- actors -->
<div itemscope itemtype="http://schema.org/Person"
itemid="http://.../person/123">
...
</div>
<div itemscope itemtype="http://schema.org/Person"
itemid="http://.../person/456">
...
</div>
This also enables the data to be spread across multiple pages without
confusion. (This is similar to how RDF uses identifiers for everything --
essentially, in RDF terms, this turns the microdata item from a bnode into
a node with a global identifier.)
Your example would become:
<div itemscope itemtype="http://schema.org/LocalBusiness"
itemid="...">
<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 itemtype="http://schema.org/LocalBusiness">
<div itemprop="containedIn"
itemscope itemtype="http://schema.org/LocalBusiness"
itemid="..."></div>
<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>
Is this not suitable for schema.org? Or is it just too much markup?
> > 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. [...]
>
> This is easier to understand than itemref, but still involves creating
> 100s of additional properties instead of just one new piece of syntax.
What do you mean by "creating additional properties" here? It's relatively
trivial to define these with one sentence, you don't need to actually list
them or anything. Implementing support is similarly easy, as far as I can
tell -- you just check for the suffix or prefix and handle it accordingly.
I don't really understand why 'itemprop-foo="bar"' would be any better
than 'itemprop="bar-foo"'. Can you elaborate on this? It seems like it
would essentially be identical in practice. There are significant costs to
introducing a new language feature here, I think, so we should definitely
consider this alternative carefully before dismissing it.
> 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" ...
If you do want to go with a new property, just use the name you would want
in the spec. I weakly recommend "itemprop-up", which is the most intuitive
name I've seen so far for this, but if you find a better name just use
that. I guarantee that I won't make the spec conflict with whatever you
use, as long as you tell me what it is. :-) Assuming that it works well,
then we would just update the spec to use that term directly,
retroactively making the experimental content conforming.
--
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