Another caveat:
If bf:workTitle is sub-class bf:Title, then this is inferencially consistent:
:X a bf:Work
bf:workTitle[ a bf:Title ;
bf:titleValue"Heart of Midlothian" ] .
:Y a bf:Instance
bf:workTitle[ a bf:Title ;
bf:titleValue"The heart of Midlothian" ] .
:Instance rdf:type owl:Class .
:Title rdf:type owl:Class .:Work rdf:type owl:Class .
:workTitle a owl:ObjectProperty ;
rdfs:range :Title
rdfs:domain :Work .
:titleValue a owl:DatatypeProperty ;
rdfs:domain :Title ;
rdfs:range rdf:PlainLiteral .
:X rdf:type :Work ,
owl:NamedIndividual ;
:workTitle :t1 .
:t1 rdf:type :Title ,
owl:NamedIndividual ;:titleValue "Heart of midlothian" .
:Y rdf:type :Instance ,
owl:NamedIndividual ;
:workTitle :t2 .
:t2 rdf:type :Title ,
owl:NamedIndividual ;
:titleValue "The heart of Midlothian" .
and bf:workTitle is never of class bf:Work (because class-ness only "flows" from property to subject, not vice versa).
So a SPARQL query of "get me all the triples for class=bf:Work" will retrieve:X a bf:Work
but never bf:workTitle, regardless of what graph it is found in. You *will* however be able to query for all bf:Title(s).