Thinking more on this....

On 10/27/14 12:17 PM, Robert Sanderson wrote:
[log in to unmask]" type="cite">

Hi Ray, all,

Regarding the Titles and Types issues, I think there's another option as well, Type as Class. Or, if I may, Type as Type :)

For example:

_:x a bf:Work ;
   bf:title _:y .
_:y a bf:KeyTitle ;
   rdf:value "..." .

I believe this is desirable for the following reasons:

* Type as String Value just isn't good linked data. The type should be uniquely distinguishable, and clearly duplicate strings could be used by multiple communities independently.  This includes all the *Scheme predicates.
[log in to unmask]" type="cite">

* Type as URI Value is better, but seems pointless when the URI could be more efficiently used as a class.  All of the bf:*Type predicates and bf:*Scheme predicates can just be rdf:type instead.

This is true, but it leaves us with the dilemma of how do we add new types. In the MARC world, this has been a real problem. When you cannot use a string, the new type has to be defined in the vocabulary before it can be used "in the wild." The process of adding to the vocabulary has been long and arduous. When laser discs came on the scene, a proposal was entered to add a type for laser disc to MARC. By the time the proposal was passed and the code was included in library systems, laser discs had gone the way of Betamax. We need a real world solution that responds to rapid change. If types are URI's then a library can mint its own URI (which will not be understood by anyone else, and may not be correctly used by its own system). If types are subclasses, then we have the problem that BF is "owned" by LC, and to add new subclasses we need an extension method that doesn't break our ability to share.

All of this is probably also true for string data to some extent, but it seems to require more coordination when types are URIs or classes.

[more below]

[log in to unmask]" type="cite">

* It makes it easier to express domain and range.

* It's more readable in the RDF/XML serialization and makes any object mapping significantly easier.

* It reduces the number of properties, thereby making it easier to see what's going on in the model.  The subclasses are there below the main class for when they're needed rather than cluttering up the top level.

* It's easy to create new types without needing to worry about domain and range of properties, just by subClassing the main class.  Otherwise, if you want to have additional predicates associated with your new instance, the domain has to be the main class rather than a subClass, which is very poor modeling.

* It simplifies many other the predicates as the main class isn't necessary in the predicate name, that's just the class of the object that the predicate is being used with.  If the predicate should have its value constrained then it shouldn't have Literal as its range.  For example no need for identifierValue, instead it can be just value.

Note the suggestion in the document that: " Aternatively, bf:title could be retained and bf:workTitle and bf:instanceTitle eliminated. bf:title would be distinguishable as a Work title (formerly, uniform title) or Instance title (formerly title proper) because it would be a property of a bf:Work or bf:Instance respectively."

Some of the "sub" title properties, e.g. bf:workTitle, either have a domain of bf:Work or bf:Instance. bf:title has the domain of Title. The statement above assumes that you would know whether you have a work title or an instance title because the bf:title would take on the "class" from the bf:Work or bf:Instance that it describes (predicates?). This is that complicated part of RDF where the domain of the property defines the class of the subject, not vice versa (as in XML, for example). A property is not a property of a class; a property's domain determines the "classness" of the subject.

I point this out because the suggestion that you can remove the main class from the name does not mean that the named property is now "classless". In the case of bf:Identifier as a class, that is fine because bf:Identifier isn't associated specifically with particular BF entities (which are defined as classes, but that's another discussion). But in the case of titles, some different types of titles are specifically designated as having either a bf:Work domain or a bf:Instance domain. If they are are defined as subclasses of bf:Title, how can bf:KeyTitle be a sub-class of bf:Title but also be of class bf:Work? If there is a way to do that, is it something we want to do?

[log in to unmask]" type="cite">

* It prevents the possible inconsistency of using a predicate that implies one type on its object, but the object has a different one (eg Work issn x ; x scheme "doi").

So I think Example 2 is the closest, but a proposed Example 5:

    bf:identifier  [
        a bf:IssnIdentifier ;
        rdf:value "12345678" .
    ] .

Where bf:IssnIdentifier is rdfs:subClassOf bf:Identifier, which is the range of bf:identifier.

The same pattern holds for all of the classes/predicates under consideration.

For titles:
    bf:title  [
        a bf:KeyTitle ;
        rdf:value "Lord of the Rings" .
    ] .

For notes:
    bf:note  [
        a bf:AdminHistNote ;
        rdf:value "Administrative history note" .
    ] .

For classifications:
    bf:classification  [
        a bf:DdcClassification ;
        rdf:value "234.5" .
    ] .

For categories:
    bf:category  [
        a bf:MediaCategory ;
        rdf:value "something" .
    ] .

For shelfmarks:
    bf:shelfmark  [
        a bf:DdcShelfmark ;
        rdf:value "12345678" .
    ] .

Relators aren't needed as objects, and relationships between Works and Instances are just relationships and thus don't need fixing.

Agreed, although the sheer number [1] of relators is rather daunting. At some point and for some functions, does that make a difference?


[log in to unmask]" type="cite">

Roles are not types, and thus Provider doesn't fit any of the patterns proposed.  Roles are closer to relationships, and thus providerRole should be dropped. If the role is printing, then Work printer Provider, just like Work creator Person.  If the role is associated with the Provider object, then it ties it exclusively to that Work so it could never be reused.

And thus to answer the three questions:

1.  Please don't do this at all :)  The model should not allow multiple, incompatible ways to say the same thing at the same time.
2.  Punning properties that can be either literal or a URI break tools and make many things, such as JSON-LD, much harder. Please don't do that either.
3.  Good documentation, with contributions from the community accepted in a timely fashion, plus encouragement in the specification to be an active participant in the work.

Hope that helps,


Rob Sanderson
Technology Collaboration Facilitator
Digital Library Systems and Services
Stanford, CA 94305

Karen Coyle
[log in to unmask]
m: +1-510-435-8234
skype: kcoylenet/+1-510-984-3600