- From: Gregg Kellogg <gregg@greggkellogg.net>
- Date: Wed, 20 Apr 2016 13:20:30 -0700
- To: Ian Dickinson <i.j.dickinson@gmail.com>
- Cc: "public-rdf-ruby@w3.org" <public-rdf-ruby@w3.org>
> On Apr 20, 2016, at 2:15 AM, Ian Dickinson <i.j.dickinson@gmail.com> wrote: > > The .qname() method on URI is quite handy, but it relies on knowing > the __prefix__ for a vocabulary. For vocabs that I define in my code, > the constructor takes the base URI of the vocabulary, but I can't see > any way to define the __prefix__. Am I missing something? Hi Ian, No, you’ve got it right. The vocabulary Prefix comes from the class name of the defined vocabulary. Also, note that URI#pname is more commonly used, and a vocabulary term can be found from RDF::Vocabulary.find_term, which can do some sanity checking too. To make sure the prefix is defined, create a Vocabulary subclass such as RDF::OWL, which will inherit this behavior. You can also create it dynamically such as is done in RDF::Vocabulary.from_graph: https://github.com/ruby-rdf/rdf/blob/develop/lib/rdf/vocabulary.rb#L276-L280. > For reference, my use case is that I'm creating constants in my code > to interact with a remote RDF store (i.e. I'm not loading files of > triples into my Ruby code, which is how I think the prefix usually > gets set on a vocabulary): > > COMMON = RDF::Vocabulary.new( "http://foo.bar.com/common/" ) > MAN = COMMON.man > FANFARE = COMMON.fanfare The problem is that you need to create a sub-class of RDF::Vocabulary. In Vocabulary.from_graph, it’s done like the following: COMMON = Class.new(RDF::Vocabulary.create("http://foo.bar.com/common/“)) Then you can do COMMON.man.pname, or COMMON.man.qname. You can also do RDF::Vocabulary.find_term("http://foo.bar.com/common/man").pname. > This all works very nicely. Later, I'd like to create a slug for the > resources I'm using, which basically comes down to the local name of > the resource: > > def slug( uri_resource ) > uri_resource.qname.second > end > > Only at the moment, FANFARE.qname returns nil because the common vocab > doesn't have a __prefix__ It should work as I described. Basically, you need to sub-class RDF::Vocabulary to get it so that RDF::Vocabulary.each will enumerate it. PR for improved documentation appreciated. Gregg > Thanks, > Ian >
Received on Wednesday, 20 April 2016 20:21:00 UTC