Relationship Transfer using OWL

Hello all,

I've been racking my brain on a problem all day.  I'm hoping that
someone on the list can help - or perhaps just tell me that what I
want to do can't be done.

I have a portfolio of products.  The portfolio contains families of
products.  Each family contains several actual, purchasable products.
I would like to be able to assert that a document talks about the
portfolio of products, and infer that it is also relevant to the
individual products themselves.  In other words, if a document
contains generic information about the product portfolio, and I am
looking for all available information about a specific product, my
query returns the document.

The statements below would work:

# Data Model
:ProductPortfolio  a  owl:Class .
:WidgetFamily1  a  owl:Class .
:inPortfolio  a  owl:ObjectProperty .

# Instance Data
:WidgetPortfolio  a  :ProductPortfolio .
:W1  a  :WidgetFamily1 .
:W1  :inPortfolio  :WidgetPortfolio .
:Doc1  dc:subject  :WidgetPortfolio .

SELECT  ?doc
WHERE { :W1   :inPortfolio  ?X .
                  ?doc  dc:subject   ?X . }

Given the model and assertions above, the query should return :Doc1,
which I can include in my search for information about :W1.

Is there a way that I can accomplish the above without having to:
- Assert < :W1  :inPortfolio  :WidgetPortfolio  >
- Determine the value of  :inPortfolio  inside the SPARQL query (resolve ?X)

It seems to me that I might be able to assert something that defines a
class containing all of the Widgets (I was thinking a owl:hasValue
restriction).  Then, using that as the target of the dc:subject
predicate, the property will flow through to each of the individual
widgets.  For example:

:Foo  a  [ magic class that winds up containing :W1 and all other widgets  ] .
:Doc1  dc:subject  :Foo .

WHERE { ?doc  dc:subject  :W1 . }

Return :Doc1

So merely asserting that Doc1 talks about the portfolio of widgets
will cause it to show up in a query of a specific widget, without
going through an intermediate, linking property.

Unfortunately I'm just not smart/skilled enough to do this.

I do have access to the following RDFS and OWL Predicates:
- rdf:type
- rdfs:domain
- rdfs:range
- rdfs:subClassOf
- rdfs:subPropertyOf
- owl:inverseOf
- owl:sameAs
- owl:TransitiveProperty
- owl:hasValue
- owl:someValuesFrom
- owl:allValuesFrom

I also recognize that "dc:subject" isn't transitive, so I would expect
to have to use a different predicate of some sort or another.

Any advice would be appreciated.

Best regards,

Michael Erickson

Received on Saturday, 23 July 2011 15:05:46 UTC