Presentation is loading. Please wait.

Presentation is loading. Please wait.

Programming with JenaBean Sources for examples can be Taylor Cowan Travelocity 8982.

Similar presentations


Presentation on theme: "Programming with JenaBean Sources for examples can be Taylor Cowan Travelocity 8982."— Presentation transcript:

1 Programming with JenaBean Sources for examples can be found @ http://jenabean.googlecode.com/svn/jenabean-lab1 Taylor Cowan Travelocity 8982

2 2 [] a foaf:Person; foaf:name Taylor Cowan; foaf:weblog ; foaf:workplaceHomepage ; foaf:holdsAccount ; foaf:currentProject ;

3 3 Model m = ModelFactory.createDefaultModel(); Thing todaysTopic = new Thing("http://jenabean.googlecode.com", m); new Thing(m).isa(Foaf.Person.class).name("Taylor Cowan").weblog(URI.create("http://thewebsemantic.com")).holdsAccount(URI.create("http://twitter.com/tcowan")).currentProject(todaysTopic).currentProject(URI.create("http://jo4neo.googlecode.com")); @see Card.java in package example.fluentwriter

4 4 AGENDA >Semantic Web Introduction >RDF basics >Coding Towards Jena’s Semantic Web Framework API >Java to Model Binding with JenaBean >Java to Model Binding with Fluent Interfaces

5 Why Not Microformats? 5 http://suda.co.uk/projects/microformats/hcard/xhtml2vcard.xsl

6 6 Some example foaf: a dc:Article ; dc:creator "Philip McCarthy"^^xsd:string ; dc:subject "jena, rdf, java, semantic web"^^xsd:string ; dc:title "Introduction to Jena"^^xsd:string.

7 7 Equivalent Raw Jena API Client Code String NS = "http://purl.org/dc/elements/1.1/"; OntModel m = ModelFactory.createOntologyModel(); OntClass articleCls = m.createClass(NS +"Article"); Individual i = articleCls.createIndividual( "http://www.ibm.com/developerworks/xml/library/j-jena/"); Property title = m.getProperty(NS + "title"); Literal l = m.createTypedLiteral("Introduction to Jena"); i.setPropertyValue(title,l); Property creator = m.getProperty(NS + "creator"); l = m.createTypedLiteral("Philip McCarthy"); i.setPropertyValue(creator,l); Property subject = m.getProperty(NS + "subject"); l = m.createTypedLiteral("jena, rdf, java, semantic web"); i.setPropertyValue(subject,l); m.write(System.out, "N3");

8 8 Pain Points of Raw Jena API Programming >You need to create unique URI’s for every entity. >You must specify the type of each primitive value. >Properties must be created for each bean property. >The impedance mismatch is similar to what we had with RDBMS

9 9 Creating The Same Assertions with JenaBean Model m = ModelFactory.createDefaultModel(); Bean2RDF writer = new Bean2RDF(m); Article article = new Article( "http://www.ibm.com/developerworks/xml/library/j-jena/"); article.setCreator("Philip McCarthy"); article.setTitle("Introduction to Jena"); article.setSubject("jena, rdf, java, semantic web"); writer.save(article); m.write(System.out, "N3");

10 10 The JenaBean Project >Hosted at Google code >Bean binding, not code generation >Doesn’t use byte code interweaving >Doesn’t require implementing an interface >http://jenabean.googlecode.com

11 11 Programming with JenaBean is Simple >Bean2RDF writes objects >RDF2Bean reads objects >3 Annotations –@Id specifies unique field –@Namespace provides a domain –@RdfProperty maps java properties to RDF properties

12 The Simplest Possible Example package examples.model; import thewebsemantic.Id; public class Person { @Id private String email; public String getEmail() { return email;} public void setEmail(String email) { this.email = email;} } 12 a ; "examples.model.Person". a ; "thewebsemantic@gmail.com"^^xsd:string.

13 Saving an Instance of Person Model m = ModelFactory.createOntologyModel(); Bean2RDF writer = new Bean2RDF(m); Person p = new Person(); p.setEmail("person@example.com"); writer.save(p); m.write(System.out, "N3"); … a owl:Class ; "example.Person". a ; "taylor_cowan@yahoo.com"^^xsd:string. 13

14 Overriding the Default Namespace package examples.model; import thewebsemantic.Id; import thewebsemantic.Namespace; @Namespace("http://mydomain#") public class Person { … } 14 a ; "examples.model.Person". a ; "thewebsemantic@gmail.com"^^xsd:string.

15 Overriding the Default Property Bindings @Namespace(“http://mydomain#”) public class Person { private String email; @RdfProperty(FOAF.NS + "name") private String name; 15 a ; "examples.model.Person". a ; "Taylor Cowan"^^xsd:string.

16 Extending Person to Support Friendship public Collection friends = new LinkedList (); @RdfProperty("http://xmlns.com/foaf/0.1/knows") public Collection getFriends() { return friends;} 16

17 Loading Beans from a Model RDF2Bean reader = new RDF2Bean(m); Person p = reader.load(Person.class,"person@example.com"); Collection allPeople = reader.load(Person.class); 17

18 JenaBean Support for OWL Entailments 18 public class Location { @Id public String id; public String name; @RdfProperty(transitive=true) public Collection within; @RdfProperty(inverseOf="within") public Collection contains; … a rdf:Property, owl:TransitiveProperty. a rdf:Property ; owl:inverseOf.

19 Reading Existing RDF/OWL 19 >Up till this point we were generating the triples >JenaBean + annotations controlled the URI’s >The model knew the provenance of all data (the originating java class)

20 Example Geonames “feature” entry 20 London Borough of Islington Islington 185500 51.5333333 -0.1333333 Jenabean will bind to existing URI’s

21 Crafting beans for existing RDF requires care 21 @Namespace("http://www.geonames.org/ontology#") public class Feature { @Id private URI uri; @RdfProperty("http://www.w3.org/2003/01/geo/wgs84_pos#lat") public double lat; 1 2 3 4 1.Namespace must accurately match 2.Your java’s classname must match the Ontology class 3.Your @Id must be of type java.net.URI 4.All property URI’s must match the Ontology property

22 JenaBean can auto discover JenaBeans, provided it knows the package(s) 22 1: Model m = ModelFactory.createDefaultModel(); 2: m.read("http://ws.geonames.org/search?q=london&type=rdf"); 3: RDF2Bean reader = new RDF2Bean(m); 4: reader.bindAll("com.foo", "com.bar"); // type safe binding by class reader.bind(Feature.class); // or package reader.bind(Feature.class.getPackage());

23 JenaBean tip: handling lang encoded strings If your data has something like this: Londres Then use JenaBean‘s special type “LocalizedString“ 23 public Collection alternateName; example.geonames

24 Query Support 24 // load using a Jena Resource reader.load(Human.class, jenaResource); // load any node using it’s URI reader.load(Human.class, "http://any.uri"); >Most most practical purposes there’s no need to utilize anything other than Jena’s ARQ api to query. JenaBean’s reader (RDF2Bean) can transform a node given it’s URI or it’s representation as a jena Resource…

25 thewebsemantic.Sparql Util 25 String query = "prefix ntn: \n" + "SELECT ?s WHERE { ?s a ntn:Woman }"; Model m = ModelFactory.createOntologyModel(); m.read("file:NTNames.owl"); m.read("file:NTN-individuals.owl"); RDF2Bean reader = new RDF2Bean(m); reader.bindAll("example.query"); Collection women = Sparql.exec(m, Woman.class, query); for (Human human : women) System.out.println(human.label + ":" + human.comment); example.query

26 Summary @Namespace(“http://yournamespace.goes.here”) Applies to class declaration @Id Applies to field or getter method Should be a String or primitive type, or wrapper type type java.net.URI is special @RdfProperty(“http://specific.property.uri”) Applies to field or getter method Remember: by definition, JavaBeans must have a default constructor. 26

27 Summary writer.save(mybean) writer.saveDeep(mybean) Save this and all related objects reader.load(Class.class, key); reader.loadDeep(…); take care, could place entire graph into memory. reader.bindAll(package, package, …); Makes jenabean aware of your beans 27

28 JenaBean Fluent Programming API 28 >AKA method chaining, foo.this().that().bar(); >A “Fluent Interface” aims to provide more readable code >A significant departure from JavaBeans >Is always connected to the jena graph >Entirely interface (not class) driven >Allows Individuals to morph into their various classes >Allows use of vocabulary terms against any Individual regardless of classification.

29 Example: wgs84 geo vocabulary 29 import thewebsemantic.As; import thewebsemantic.Functional; import thewebsemantic.Namespace; @Namespace("http://www.w3.org/2003/01/geo/wgs84_pos#") public interface Geo extends As { interface Point extends Geo{} @Functional Geo lat(float l); Float lat(); @Functional Geo long_(float l); Float long_(); }

30 A fluent api + good IDE makes things fun 30

31 Create a new anonymous iCal event. 31 Ical t = new Thing(m).isa(Ical.Vevent.class); Create a new iCal event with URI Ical t = new Thing(“http://uri”, m). isa(Ical.Vevent.class);

32 Full Example: Creating an iCal event for the meetup 32 1: Ical.Vevent t = new Thing(m).isa(Ical.Vevent.class); 2: t.uid("event_11978192@meetup.com"). 3: dtstart("20100124T200000Z"). 4: dtend("20100124T220000Z"). 5: summary("Jena Semantic Web…"). 6: location("Parisoma - …") 7:.as(Geo.class). 8: lat(37.77f). 9: long_(-122.41f); [] a ical:Vevent ; ical:dtend "20100124T220000Z" ; ical:dtstart "20100124T200000Z" ; ical:location "Parisoma - " ; ical:summary "Jena Semantic Web…" ; ical:uid "event_11978192@meetup.com" ; geo:lat "37.77"^^xsd:float ; geo:long "-122.41"^^xsd:float.

33 JenaBean comes with a few common vocabulary interfaces 33 >thewebsemantic.vocabulary.Foaf >Geo >Ical >DCTerms >Sioc >Skos >Rdfs >ReviewVocab >You may want to copy and modify in some cases.

34 Fluent API summary: 34 >Your interface should extend thewebsemantic.As >Provides polymorphic “as(Class)” to other vocabs. >Provides easy type declaration with “isa(Class)” >Use the @Namespace annotation to bind to the vocabulary >Name setters according to vocab, taking either an Object (literal) or anther Thing (relationship to other Individuals) >Name getters according to vocab, returning the same vocabulary type and taking no arguments. >If the vocabulary term collides with reserved term (as with long), append a dash. >Plural properties should return a Collection.

35 35 Project Ideas >Create your own foaf document using the fluent interface. >Integrate Jena/JenaBean with restlets –restlets.org >Use your favorite framework (struts, stripes, spring mvc) and create a user registration screen. >Write JenaBeans that bind to jamendo or other music ontology at http://dbtune.org http://dbtune.org >Write a foaf crawler beginning with Berners-Lee that traverses his social graph. cc nickjohnson http://flickr.com/photots/npj/

36 Taylor Cowan http://thewebsemantic.com http://twitter.com/tcowan Travelocity taylor.cowan@travelocity.com


Download ppt "Programming with JenaBean Sources for examples can be Taylor Cowan Travelocity 8982."

Similar presentations


Ads by Google