- From: Andy Seaborne <andy@apache.org>
- Date: Tue, 4 Aug 2020 17:34:10 +0100
- To: www-rdf-interest@w3.org
- Message-ID: <3afde9e6-069e-6492-dfb3-3d4e6dbbc4fd@apache.org>
> From: McBride, Brian <bwm@hplb.hpl.hp.com> > Date: Fri, 4 Aug 2000 17:34:28 +0100 > Message-ID: <5E13A1874524D411A876006008CD059F1006CD@0-mail-1.hpl.hp.com> > To: "RDF Interest (E-mail)" <www-rdf-interest@w3.org> > > I have been getting feedback about the current java RDF API from potential > RDF users in HPLabs. A number of issues with the current API are inhibiting > the adoption of RDF in this organisation. I have been exploring some ideas > for addressing these issues in the form of an evolution of the SiRPAC API. > I'd appreciate the comments of this group on the results. > > I am in the process of building an implementation of these enhancements > which I intend to make freely available. I have got far enough with the > design that I am reasonably confident that it is implementable. I would > like to get early feedback before getting too far into the implementation. > In particular I'd welcome comments on: > > * is the overall style appealing? > * preferences for strict evolution from the current SiRPAC API versus > conforming to current java stylistic conventions > * detailed comments on the interfaces > > I'd like to stress that what I am proposing is an evolution of the excellent > work that has already been done on RDF API's. This evolution has been > motivated by a desire to address specific concerns raised by potential > users. I'd also like to acknowledge that I 'borrowed' the core idea from > Dave Beckett at ILRT. > > The main changes are: > > * whilst maintaining the current statement centric method calls, added > a set of resource centric method calls which are cascadable to make code > easier to read and write > * explicit container support > * typed data values in literals - supports built in types and user > defined objects > * property as an explicit type > > * subclassing of resource to provide resource specific behaviour (used > by containers) > * explicit support for reification (... dare I mention this :) > * a style more consistent with current java api practice > > Here are some brief code samples: > > // create the structure in Figure 2 of m&s > > Resource ora = model.createResource() > .addProperty(Dc.name, "Ora Lassila") > .addProperty(Dc.email, <mailto:lassila@w3.org> > lassila@w3.org); > > Resource page = model.createResource( <http://www.w3.org/Home/Lassila> > http://www.w3.org/Home/Lassila) > .addProperty(Dc.creator, ora); > > > The alternative in the current API (as I have implemented it) might be: > > Resource ora = model.createResource(); > model.add(model.createStatement(ora, DC.name, "Ora Lassila")); > model.add(model.createStatement(ora, DC.email, lassila@w3.org > <mailto:lassila@w3.org> )); > Resource page = model.createResource(); > model.add(model.createStatement(page, DC.creator, ora); > > // create bag structure from figure 4 of m&s > > Resource bag = model.createBag() > .addResource("/Students/Amy") > .addResource("/Students/Tim") > .addResource("/Students/John") > .addResource("/Students/Mary") > .addResource("/Students/Sue"); > Resource course = model.createResource("/courses/6.001") > .addProperty(Myschema.students, bag); > > Again the alternative: > > Resource student = null; > Resource course = model.createResource("/courses/6.001"); > Resource bag = model.createResource(); > model.add(model.createStatement(bag, RDF.type, RDF.Bag)); > model.add(model.createStatement(course, MYSCHEMA.students, bag)); > student = model.createResource("/Students/Amy"); > model.add(model.createStatement(bag, RDF.li(1), student)); > student = model.createResource("/Students/Tim"); > model.add(model.createStatement(bag, RDF.li(2), student)); > student = model.createResource("/Students/John")); > model.add(model.createStatement(bag, RDF.li(3), student)); > student = model.createResource("/Students/Mary"); > model.add(model.createStatement(bag, RDF.li(4), student)); > student = model.createResource("/Students/Sue"); > model.add(model.createStatement(bag, RDF.li(5), student)); > > // access the i'th element of the bag starting from course > > Resource student = course.getProperty(Myschema.students) > .getProperty(Rdf.li(i)).getResource(); > > Again the alternative > > Model m = model.find(course, MYSCHEMA.students, null) > Statement s = (Statement) m.elements.next(); > m = model.find(s.subject(), RDF.li(i), null); > s = (Statement) m.elements.next()); > Resource student = (Resource) s.object(); > > // a reification from figure 8 of m&s > > Resource page = model.createResource("http://www.w3.org/Home/Lassila") > Model.createStatement(page, Dc.creator, "Ora Lassila") > .addProperty(SomeSchema.attributedTo, "Ralph Swick"); > > // creating and accessing a compound value from figure 15 of m&s > > john.addProperty(Nschema.weight, model.createResource() > .addProperty(Rdf.value, 200) > .addProperty(Nschema.units. > Nschema.Pounds)); > int weight = john.getProperty(Nschema.weight) > .getProperty(Rdf.value).getInt(); > > // transactions (if supported) are also inline > > Resource bag = model.begin() > .createBag() > .addResource("/Students/Amy") > .addResource("/Students/Tim") > .addResource("/Students/John") > .addResource("/Students/Mary") > .addResource("/Students/Sue") > .commit(); > > // there are two kinds of query operation - one group returns iterators on > the > // the current model, the other group, as with the original returns, a new > model. > > // return an iterator over all bags in the model > > ResIterator iter = model.listSubjectsWithPredicate(Rdf.type, Rdf.Bag); > > // return all the creators in a model > > ResIterator iter = model.listObjectsOfPredicate(Dc.creator); > > > > > That should be enough to give a flavour. The current (work in progress) > interface files are attached. > > Brian McBride > HPLabs
Attachments
- application/zip attachment: api2.zip
Received on Tuesday, 4 August 2020 16:34:28 UTC