×÷Õߣºapril1019
ÒÔÏÂΪÔÎÄ£º
JenaÎĵµ¡¶An Introduction to RDF and the Jena RDF API¡·µÄÒëÎÄ
RDFºÍJena RDF APIÈëÃÅ
________________________________________
ǰÑÔ
±¾ÎÄÊÇһƪ¶ÔW3CµÄ×ÊÔ´ÃèÊö¿ò¼Ü(RDF)ºÍ Jena(Ò»¸öJavaµÄRDF API)µÄ½Ì³ÌÐÔ½éÉÜ. ±¾ÎÄÊÇΪÄÇЩ²»ÊìϤRDFµÄ, ÒÔ¼°ÄÇЩͨ¹ý½¨Á¢ÔÐοÉÒÔ´ïµ½×îºÃѧϰЧ¹ûµÄ, »òÊÇÒòΪÆäËûÔÒòÏ£ÍûÄÜ¿ìËÙ²Ù×÷JenaµÄ³ÌÐòÔ±¶øÐ´µÄ. ÎÒÃǼÙÉè¶ÁÕßÔÚÔĶÁ±¾ÎÄǰÒѾßÓÐÒ»¶¨µÄXMLºÍJava֪ʶ.
Èç¹û¶ÁÕßÔÚûÓÐÀí½âRDFÊý¾ÝÄ£Ð͵Ļù´¡ÉϾÍѸËÙ½øÈë²Ù×÷½×¶Î,ÍùÍù»áµ¼ÖÂʧ°ÜºÍʧÍû. È»¶ø,Èç¹û¹âѧϰÊý¾ÝÄ£ÐÍÓÖÊÇÊ®·Ö¿ÝÔ﷦ζµÄ, ²¢³£³£»áµ¼ÖÂÇúÕÛµÄÐζøÉÏѧµÄÄÑÌâ. ¸üºÃµÄѧϰ°ì·¨ÊÇÔÚÀí½âÊý¾ÝÄ£Ð͵ÄͬʱÁ·Ï°²Ù×÷Ëü. ¿ÉÒÔÏÈѧϰһµãÊý¾ÝÄ£ÐÍÔÙ¶¯ÊÖÊÔÒ»ÊÔ.È»ºóÔÚѧϰһµãÔÙÊÔÒ»ÊÔ. ÕâÑùÒ»À´¾ÍÄÜ´ïµ½ÀíÂÛʵ¼ùÏà½áºÏµÄЧ¹û.Êý¾ÝÄ£Ðͱ¾ÉíÊ®·Ö¼òµ¥,ËùÒÔѧϰ¹ý³Ì²»»áÌ«³¤.
RDF¾ßÓÐXMLµÄÓï·¨, ËùÒÔÐí¶àÊìϤXMLµÄÈ˾ͻáÈÏΪÒÔXMLÓï·¨µÄÐÎʽÀ´Ë¼¿¼RDF. È»¶ø, ÕâÊDz»¶ÔµÄ. RDFÓ¦¸ÃÒÔËüÊý¾ÝÄ£Ð͵ÄÐÎʽÀ´±»Àí½â. RDFÊý¾Ý¿ÉÊÇÓÃXMLÀ´±íʾ, µ«ÊÇÀí½âÊý¾ÝÄ£Ð͵ÄÖØÒªÐÔ¸üÔÚÀí½â´ËÓï·¨ÖØÒªÐÔÖ®ÉÏ.
Jena APIµÄÒ»¸öÔËÐÐÀý×Ó, °üÀ¨±¾½Ì³ÌÖÐËùÓÐÀý×ӵŤ×÷Ô´´úÂë¶¼¿ÉÒÔÔÚhttp://www.hpl.hp.com/semweb/ÏÂÔØ.
________________________________________
Ŀ¼
1. µ¼ÑÔ
2. ³ÂÊöStatements
3. RDFд²Ù×÷
4. RDF¶Á²Ù×÷
5. Jena RDF °ü
6. ²Ù×ÝÄ£ÐÍ
7. ²éѯģÐÍ
8. ¶ÔÄ£Ð͵IJÙ×÷
9. ÈÝÆ÷Containers
10. ¹ØÓÚLiteralsºÍÊý¾ÝÀàÐ͵ĸü¶à̽ÌÖ
11. ÊõÓï±í
________________________________________
µ¼ÑÔ
×ÊÔ´ÃèÊö¿ò¼ÜÊÇ(RDF)ÊÇÃèÊö×ÊÔ´µÄÒ»Ïî±ê×¼(ÔÚ¼¼ÊõÉÏÊÇW3CµÄÍÆ¼ö±ê×¼). ʲôÊÇ×ÊÔ´? ÕâʵÔÚÊÇÒ»¸öºÜÄѻشðµÄÎÊÌâ, Æä¾«È·µÄ¶¨ÒåĿǰÉÐÔÚÕùÂÛÖÐ. ³öÓÚÎÒÃǵÄÄ¿µÄ, ÎÒÃÇ¿ÉÒÔ°Ñ×ÊÔ´ÏëÏó³ÉÈκÎÎÒÃÇ¿ÉÒÔÈ·¶¨Ê¶±ðµÄ¶«Î÷. ÔÚ±¾½Ì³ÌÖÐ,¶ÁÕßÄã±¾Éí¾ÍÊÇÒ»¸ö×ÊÔ´, ¶øÄãµÄÖ÷Ò³Ò²ÊÇÒ»¸ö×ÊÔ´, Êý×Ö1ºÍ¹ÊÊÂÖо޴óµÄ°×¾¨¶¼ÊÇ×ÊÔ´.
ÔÚ±¾½Ì³ÌÖÐ, ÎÒÃǵÄÀý×Ó»áÎ§ÈÆÈËÃÇÕ¹¿ª. ¼ÙÉèÈËÃÇ»áʹÓÃVCARDS, ¶øVCARD½«ÓÉRDF±íʾ»úÖÆÀ´ÃèÊö. ÎÒÃÇ×îºÃ°ÑRDF¿¼ÂdzÉÓɽáµãºÍ¼ýÍ·µÄÐÎʽ¹¹³ÉµÄͼ. Ò»¸ö¼òµ¥µÄvcardÔÚRDFÖпÉÄÜ¿´ÆðÀ´ÊÇÕâÑùµÄ:
×ÊÔ´John SmithÔÚͼÖÐÓÃÍÖÔ²±íʾ, ²¢±»Ò»¸öͳһ×ÊÔ´¶¨Î»·û(URI) Ëù±êʶ, ÔÚ±¾ÀýÖÐÊÇ"http://.../JohnSmith"). Èç¹ûÄãÏëҪͨ¹ýÄãµÄä¯ÀÀÆ÷À´·ÃÎÊÕâ¸ö×ÊÔ´µÄ»°,ÄãºÜÓпÉÄÜ»áʧ°Ü. ËÄÔµÄÓÞÈ˽ÚЦ»°²¢²»¾µÃÆð¿¼Ñé, Ïà·´Èç¹ûÄãµÄä¯ÀÀÆ÷°ÑJohn Smith´«µÝµ½ÄãµÄ×ÀÃæµÄ»°, Äã²Å¸Ã¸Ðµ½¾ªÑÈ. Èç¹ûÄã²¢²»ÊìϤURI'sµÄ»°, Äã¿ÉÒÔ°ÑËüÃÇÏëÏó³É¼òµ¥µÄİÉúÃû×Ö.
×ÊÔ´ÓµÓÐÊôÐÔ(property). ÔÚÕâЩÀý×ÓÖÐ, ÎÒÃǶÔJohn SmithÃûƬÉϳöÏÖµÄÄÇЩÊôÐԺܸÐÐËȤ.ͼ1Ö»ÏÔʾÁËÒ»¸öÊôÐÔ, John SmithµÄÈ«Ãû. ÊôÐÔÊÇÓɱêÓÐÊôÐÔÃûµÄ¼ýÍ·±íʾµÄ. ÊôÐÔµÄÃû×ÖÒ²ÊÇÒ»¸öURI, µ«ÊÇÓÉÓÚURIÊ®·ÖÈß³¤±¿ÖØ, ËùÒÔͼÖн«ËüÏÔʾΪXML qnameµÄÐÎʽ. ÔÚ':'֮ǰµÄ²¿·Ö³ÆÎªÃüÃû¿Õ¼äǰ׺²¢±íʾÁËÒ»¸öÃüÃû¿Õ¼ä. ÔÚ':'Ö®ºóµÄ²¿·Ö³ÆÎª¾Ö²¿Ãû, ²¢±íʾÔÚÃüÃû¿Õ¼äÖеÄÒ»¸öÃû×Ö. ÔÚд³ÉRDF XMLÐÎʽʱ, ÊôÐÔ³£³£ÒÔqnameµÄÐÎʽ±íʾ, ÕâÊÇÒ»¸öÔÚͼÐκÍÎı¾Öеļòµ¥µÄËõд·½·¨. È»¶ø, ÑϸñµØ½², ÊôÐÔÓ¦¸ÃÓÃURIÀ´±êʶ. ÃüÃû¿Õ¼äǰ׺:¾Ö²¿ÃûµÄÐÎʽÊÇÒ»ÖÖÃüÃû¿Õ¼äÁ¬½Ó¾Ö²¿ÃûµÄURIËõд. µ±ä¯ÀÀÆ÷·ÃÎÊʱ, Óò¢Ã»ÓÐÇ¿ÖÆÊôÐÔµÄURI±ØÐëÖ¸ÏòһЩ¾ßÌåµÄÊÂÎï.
ÿ¸öÊôÐÔ¶¼ÓÐÒ»¸öÖµ. ÔÚ´ËÀýÖÐ, ֵΪһ¸öÎı¾(literal), ÎÒÃÇÏÖÔÚ¿ÉÒÔ°ÑËü¿´³ÉÒ»¸ö×Ö·û´®.Îı¾ÔÚͼÖÐÏÔʾΪ³¤·½ÐÎ.
JenaÊÇÒ»¸öJava API, ÎÒÃÇ¿ÉÒÔÓÃËüÀ´´´½¨ºÍ²Ù×ÝÖîÈçÉÏÊöÀýͼµÄRDFͼ. JenaÉèÓбíʾͼ(graph), ×ÊÔ´(resource), ÊôÐÔºÍÎı¾(literal)µÄ¶ÔÏóÀà. ±íʾ×ÊÔ´, ÊôÐÔºÍÎı¾µÄ½Ó¿Ú·Ö±ð³ÆÎªResource, Property, ºÍLiteral. ÔÚJenaÖÐ, Ò»¸öͼ(graph)±»³ÆÎªÒ»¸öÄ£ÐͲ¢±»Model½Ó¿ÚËù±íʾ.
´´½¨ÉÏÊöÀýͼ»ò³ÆÎªÉÏÊöÄ£Ð͵ĴúÂëºÜ¼òµ¥:
// some definitions
static String personURI = "http://somewhere/JohnSmith";
static String fullName = "John Smith";
// create an empty Model
Model model = ModelFactory.createDefaultModel();
// create the resource
Resource johnSmith = model.createResource(personURI);
// add the property
johnSmith.addProperty(VCARD.FN, fullName);
ÕâЩ´úÂëÏȶ¨ÒåÁËһЩ³£Á¿, È»ºóʹÓÃÁËModelFactoryÀàÖеÄcreateDefaultMode()·½·¨´´½¨ÁËÒ»¸ö¿ÕµÄ»ùÓÚÄÚ´æ´æ´¢µÄÄ£ÐÍ(Model »ò model). Jena»¹°üº¬ÁËModel½Ó¿ÚµÄÆäËûʵÏÖ·½Ê½. ÀýÈç, ʹÓùØÏµÊý¾Ý¿âµÄ, ÕâЩÀàÐÍ Model½Ó¿ÚÒ²¿ÉÒÔ´ÓModelFactoryÖд´½¨.
ÓÚÊÇJohn SmithÕâ¸ö×ÊÔ´¾Í±»´´½¨ÁË, ²¢ÏòÆäÌí¼ÓÁËÒ»¸öÊôÐÔ. ´ËÊôÐÔÓÉÒ»¸ö"³£" ("constant")ÀàVCARDÌṩ, Õâ¸öÀà±£´æÁËÔÚVCARDģʽ(schema)ÖÐËùÓж¨ÒåµÄ±íʾ¶ÔÏó. JenaҲΪÆäËûÒ»Ð©ÖøÃûµÄģʽÌṩÁ˳£ÀàµÄ±íʾ·½·¨, ÀýÈçÊÇRDFºÍRDFģʽ, Dublin ºËÐıê×¼ºÍDAML.
´´½¨×ÊÔ´ºÍÌí¼ÓÊôÐԵĴúÂë¿ÉÒÔд³É¸ü½ô´ÕµÄ²ãµþÐÎʽ:
Resource johnSmith =
model.createResource(personURI)
.addProperty(VCARD.FN, fullName);
Õâ¸öÀý×ӵŤ×÷´úÂë¿ÉÒÔÔÚJena·¢²¼µÄ²ÄÁϵĽ̳̰üÖеÄTutorial1ÖÐÕÒµ½. ×÷ΪÁ·Ï°, Äã×Ô¼º¿ÉÒÔ»ñµÃ´Ë´úÂë²¢ÐÞ¸ÄÆäÒÔ´´½¨Ò»¸ö¼òµ¥VCARD.
ÏÖÔÚÈÃÎÒÃÇΪvcardÔÙÔö¼ÓһЩ¸üÏêϸµÄÄÚÈÝ, ÒÔ±ã̽Ë÷¸ü¶àµÄRDFºÍJenaµÄÌØÐÔ.
ÔÚµÚÒ»¸öÀý×ÓÀï, ÊôÐÔֵΪһ¸öÎı¾. È»¶øRDFÊôÐÔÒ²¿ÉÒÔ²ÉÓÃÆäËûµÄ×ÊÔ´×÷ΪÆäÊôÐÔÖµ. ÏÂÃæÕâ¸öÀý×ÓʹÓó£ÓõÄRDF¼¼ÊõչʾÁËÈçºÎ±íʾJohn SmithÃû×ֵIJ»Í¬²¿·Ö:
ÔÚÕâÀïÎÒÃÇÔö¼ÓÁËÒ»¸öеÄÊôÐÔ, vcard:N, À´±íʾJohn SmithÃû×ֵĽṹ. Õâ¸öÄ£ÐÍÓм¸µãÓÐȤ֮´¦. ×¢ÒâÊôÐÔvcard:NʹÓÃÒ»¸ö×ÊÔ´×÷ΪÆðÊôÐÔÖµ. ͬʱעÒâ´ú±í¸´ºÏÃû×ÖµÄÍÖÔ²²¢Ã»ÓÐURI±êʶ. Ëü±»ÈÏΪÊÇÒ»¸ö¿Õ°×½áµã(blank Node).
´´½¨´ËÀýµÄJena´úÂëҲʮ·Ö¼òµ¥. Ê×ÏÈÊÇһЩÉùÃ÷ºÍ¶Ô¿ÕÄ£Ð͵Ĵ´½¨.
// some definitions
String personURI = "http://somewhere/JohnSmith";
String givenName = "John";
String familyName = "Smith";
String fullName = givenName + " " + familyName;
// create an empty Model
Model model = ModelFactory.createDefaultModel();
// create the resource
// and add the properties cascading style
Resource johnSmith
= model.createResource(personURI)
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));
´ËÀýµÄ¹¤×÷´úÂë¿ÉÒÔÔÚJena·¢²¼²ÄÁϵĽ̳̰üµÄTutorial2Öеõ½.
________________________________________
³ÂÊö
RDFÄ£ÐÍÖеÄÿһ¸ö¼ýÍ·±íʾΪһ¸ö³ÂÊö(statement). ÿһ¸ö³ÂÊöÉùÃ÷Á˹ØÓÚij¸ö×ÊÔ´µÄij¸öÊÂʵ. Ò»¸ö³ÂÊöÓÐÈý²¿·Ö×é³É.
Ö÷Ìå, Ò²¾ÍÊǼýÍ·µÄ³ö·¢µÄ×ÊÔ´.
ν´Ê, Ò²¾ÍÊDZêʶ¼ýÍ·µÄÊôÐÔ.
¿ÍÌå, Ò²¾ÍÊǼýÍ·ËùÖ¸ÏòµÄÄǸö×ÊÔ´»òÎı¾.
Ò»¸ö³ÂÊöÓÐʱҲ½Ð×öÒ»¸öÈýÔª×éµÄÔÒò¾ÍÊÇËüÓÉÈý²¿·Ö×é³É.
Ò»¸öRDFÄ£ÐÍ(ÒëÕß×¢: Ö¸JenaÖеĽӿÚModel)ÊÇÓÉÒ»×é³ÂÊöËù×é³ÉµÄ. ÔÚTutorial2ÖÐ, ÿµ÷ÓÃÒ»´ÎaddPropertyº¯Êý¾Í»áÔÚÄ£ÐÍÖÐÔö¼ÓÁíÒ»¸ö³ÂÊö. (ÒòΪһ¸öÄ£ÐÍÊÇÓÉÒ»×é³ÂÊö×é³ÉµÄ, ËùÒÔÔö¼ÓÒ»¸öÖØ¸´µÄ³ÂÊö²¢²»»á²úÉúÈκÎÒâÒå.) JenaÄ£Ðͽӿڶ¨ÒåÁËÒ»¸ölistStatements()·½·¨, ´Ë·½·¨»á·µ»ØÒ»¸öStmtIteratorÀàÐ͵ıäÁ¿. StmtItorÊÇJavaÖÐIteratorµÄÒ»¸ö×ÓÀàÐÍ, Õâ¸öStmtIterator±äÁ¿Öظ´µü´úÁ˸ýӿÚÄ£ÐÍÖеÄËùÓгÂÊö. StmtIteratorÀàÐÍÖÐÓÐÒ»¸ö·½·¨nextStatement(), ¸Ã·½·¨»á´Óiterator·µ»ØÏÂÒ»¸ö³ÂÊö. (¾ÍºÍnext()·µ»ØµÄÒ»Ñù, µ«ÊÇÒѽ«ÆäÓ³ÉäΪStatementÀàÐÍ). ½Ó¿ÚStatementÌṩÁË·ÃÎʳÂÊöÖÐÖ÷Ìå, ν´ÊºÍ¿ÍÌåµÄ·½·¨.
ÏÖÔÚÎÒÃÇ»áÓÃʹÓÃÄǸö½Ó¿ÚÀ´À©Õ¹Tutorial2, ʹÆðÁгöËùÓеĴ´½¨µÄ³ÂÊö²¢½«ËüÃÇ´òÓ¡³öÀ´. ´ËÀýÍêÕûµÄ´úÂë¿ÉÒÔÔÚTutorial3ÖÐÕÒµ½.
// list the statements in the Model
StmtIterator iter = model.listStatements();
// print out the predicate, subject and object of each statement
while (iter.hasNext()) {
Statement stmt = iter.nextStatement(); // get next statement
Resource subject = stmt.getSubject(); // get the subject
Property predicate = stmt.getPredicate(); // get the predicate
RDFNode object = stmt.getObject(); // get the object
System.out.print(subject.toString());
System.out.print(" " + predicate.toString() + " ");
if (object instanceof Resource) {
System.out.print(object.toString());
} else {
// object is a literal
System.out.print(" \\"" + object.toString() + "\\"");
}
System.out.println(" .");
}
ÒòΪһ¸ö³ÂÊöµÄ¿ÍÌå¿ÉÒÔÊÇÒ»¸ö×ÊÔ´Ò²¿ÉÒÔÊÇÒ»¸öÎı¾. getObject()·½·¨»á·µ»ØÒ»¸öÀàÐÍΪRDFNodeµÄ¿ÍÌå, RDFNodeÊÇResourceºÍLiteralÀ๲ͬµÄ³¬Àà. ΪÁËÈ·¶¨±¾ÀýÖеĿÍÌåÈ·ÇеÄÀàÐÍ, ´úÂëÖÐʹÓà instanceofÀ´È·¶¨ÆäÀàÐͺÍÏàÓ¦µÄ´¦Àí.
ÔËÐкó, ´Ë³ÌÐò»Ø²úÉúÓë´ËÏàËÆµÄÊä³ö:
http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#N anon:14df86:ecc3dee17b:-7fff.
anon:14df86:ecc3dee17b:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Family "Smith".
anon:14df86:ecc3dee17b:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Given "John" .
http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#FN "John Smith".
ÏÖÔÚÄãÃ÷°×ÁËΪʲôģÐ͹¹½¨»á¸ü¼ÓÇåÎú. Èç¹ûÄã×Ðϸ¹Û²ì, ¾Í»á·¢ÏÖÉÏÃæÃ¿Ò»Ðж¼ÓÉÈý¸öÓò×é³É, ÕâÈý¸öÓò·Ö±ð´ú±íÁËÿһ¸ö³ÂÊöµÄÖ÷Ìå, ν´ÊºÍ¿ÍÌå. ÔÚ´ËÄ£ÐÍÖÐÓÐËĸö¼ýÍ·, ËùÒÔ»áÓÐËĸö³ÂÊö. "anon:14df86:ecc3dee17b:-7fff"ÊÇÓÐJena²úÉúµÄÒ»¸öÄÚ²¿±êʶ·û, Ëü²»ÊÇÒ»¸öURI, Ò²²»Ó¦¸ÃÓëURI»ìÏý. ËüÖ»ÊÇJena´¦ÀíʱʹÓõÄÒ»¸öÄÚ²¿±êºÅ.
W3CµÄRDFºËÐŤ×÷С×鶨ÒåÁËÒ»¸öÀàËÆµÄ±íʾ·ûºÅ³ÆÎªN-ÈýÔª×é(N-Triples). Õâ¸öÃû×Ö±íʾ»áʹÓÃ"ÈýÔª×é·ûºÅ". ÔÚÏÂÒ»½ÚÖÐÎÒÃǻῴµ½JenaÓÐÒ»¸öÄÚÖõÄN-ÈýÔª×éд»úÖÆ(writer).
________________________________________
дRDF
JenaÉèÓжÁдXMLÐÎʽµÄRDF·½·¨. ÕâЩ·½·¨¿ÉÒÔ±»ÓÃÀ´½«Ò»¸öRDFÄ£Ðͱ£´æµ½Îļþ²¢ÔÚÈÕºóÖØÐ½«Æä¶Á»Ø.
Tutorial3´´½¨ÁËÒ»¸öÄ£ÐͲ¢½«ÆäÒÔÈýÔª×éµÄÐÎʽÊä³ö. Tutorial4¶ÔTutorial3×öÁËÐÞ¸Ä, ʹÆä½«´ËÄ£ÐÍÒÔRDF XMLµÄÐÎʽÊä³öµ½±ê×¼Êä³öÁ÷ÖÐ. Õâ¸ö´úÂëÒÀȻʮ·Ö¼òµ¥: model.write¿ÉÒÔ´øÒ»¸öOutputStreamµÄ²ÎÊý.
// now write the model in XML form to a file
model.write(System.out);
Ó¦¸ÃÓÐÀàËÆµÄÊä³ö:
<rdf:RDF
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
>
<rdf:Description rdf:about='http://somewhere/JohnSmith'>
<vcard:FN>John Smith</vcard:FN>
<vcard:N rdf:nodeID="A0"/>
</rdf:Description>
<rdf:Description rdf:nodeID="A0">
<vcard:Given>John</vcard:Given>
<vcard:Family>Smith</vcard:Family>
</rdf:Description>
</rdf:RDF>
W3CµÄRDF¹æ¸ñ˵Ã÷Ê鹿¶¨ÁËÈçºÎÓà XMLµÄÐÎʽÀ´±íʾRDF. RDF XMLµÄÓ﷨ʮ·Ö¸´ÔÓ. ¶ÁÕß¿ÉÒÔÔÚRDFºËÐŤ×÷С×éÖÆ¶¨µÄRDFÈëÃÅÆª(primer)ÖÐÕÒµ½¸üÏêϸµÄÖ¸µ¼. µ«ÊDz»¹ÜÔõôÑù, ÈÃÎÒÃÇÏÈѸËÙ¿´Ò»ÏÂÓ¦¸ÃÈçºÎ½âÊÍÉÏÃæµÄRDF XMLÊä³ö
RDF³£³£Ç¶ÈëÔÚÒ»¸ö<rdf:RDF>ÔªËØÖÐ. Èç¹ûÓÐÆäËûµÄ·½·¨ÖªµÀ´ËXMLÊÇRDFµÄ»°,¸ÃÔªËØÊÇ¿ÉÒÔ²»Ð´µÄ. È»¶øÎÒÃdz£³£»áʹÓÃËü. ÔÚÕâ¸öRDFÔªËØÖж¨ÒåÁËÁ½¸öÔÚ±¾ÎĵµÖÐʹÓõÄÃüÃû¿Õ¼ä. ½ÓÏÂÀ´ÊÇÒ»¸ö<rdf:Description>ÔªËØ, ´ËÔªËØÃèÊöÁËURIΪ"http://somewhere/JohnSmith"µÄ×ÊÔ´. Èç¹ûÆäÖеÄrdf:aboutÊôÐÔ±»Ê¡ÂԵϰ, Õâ¸öÔªËØ¾Í±íʾһ¸ö¿Õ°×½áµã.
<vcard:FN>ÔªËØÃèÊöÁË´Ë×ÊÔ´µÄÒ»¸öÊôÐÔ. ÊôÐÔµÄÃû×Ö"FN"ÊÇÊôÓÚvcardÃüÃû¿Õ¼äµÄ. RDF»áͨ¹ýÁ¬½ÓÃüÃû¿Õ¼äǰ׺µÄURIºÍÃû×Ö¾Ö²¿Ãû"FN"À´ÐγɸÃ×ÊÔ´µÄURI "http://www.w3.org/2001/vcard-rdf/3.0#FN". Õâ¸öÊôÐÔµÄֵΪÎı¾"John Smith".
<vcard:N>ÔªËØÊÇÒ»¸ö×ÊÔ´. ÔÚ´ËÀýÖÐ, Õâ¸ö×ÊÔ´ÊÇÓÃÒ»¸öÏà¶ÔURIÀ´±íʾµÄ. RDF»áͨ¹ýÁ¬½ÓÕâ¸öÏà¶ÔURIºÍ´ËÎĵµµÄ»ù×¼URIÀ´°ÑËüת»»ÎªÒ»¸ö¾ø¶ÔURI.
µ«ÊÇ, ÔÚÕâ¸öRDF XMLÊä³öÖÐÓÐÒ»¸ö´íÎó, Ëü²¢Ã»ÓÐ׼ȷµØ±íʾÎÒÃÇËù´´½¨µÄÄ£ÐÍ. Ä£ÐÍÖеĿհ׽áµã±»·ÖÅäÁËÒ»¸öURI. Ëü²»ÔÙÊǿհ׵ÄÁË. RDF/XMLÓï·¨²¢²»ÄܱíʾËùÓеÄRDFÄ£ÐÍ. ÀýÈçËü²»Äܱíʾһ¸öͬʱÊÇÁ½¸ö³ÂÊöµÄ¿ÍÌåµÄ¿Õ°×½áµã. ÎÒÃÇÓÃÀ´Ð´Õâ¸öRDF/XMLµÄ'ÑÆ'writer·½·¨²¢Ã»ÓÐÊÔͼȥÕýÈ·µÄÊéдÕâ¸öÄ£Ð͵Ä×Ó¼¯, ËäÈ»ÆäÔ±¾¿ÉÒÔ±»ÕýÈ·Êéд. Ëü¸øÃ¿Ò»¸ö¿Õ°×½áµãÒ»¸öURI, ʹÆä²»ÔÙ¿Õ°×.
JenaÓÐÒ»¸öÀ©Õ¹µÄ½Ó¿Ú, ËüÔÊÐíеÄΪ²»Í¬µÄRDF´®Ðл¯ÓïÑÔÉè¼ÆµÄwriter¿ÉÒÔ±»ÇáÒ׵زåÈë. ÒÔÉϵĵ÷Óûἤ·¢Ò»¸ö±ê×¼µÄ'ÑÆ'writer·½·¨. JenaÒ²°üº¬ÁËÒ»¸ö¸ü¼Ó¸´ÔÓµÄRDF/XML writer, Ëü¿ÉÒÔ±»ÓÃЯ´øÁíÒ»¸ö²ÎÊýµÄwrite()·½·¨Ëùµ÷ÓÃ.
// now write the model in XML form to a file
model.write(System.out, "RDF/XML-ABBREV");
´Ëwriter, Ò²¾ÍÊÇËùνµÄPrettyWriter, ÀûÓÃRDF/XMLËõдÓï·¨°ÑÄ£ÐÍдµØ¸üΪ½ô´Õ. ËüÒ²Äܱ£´æ¾¡¿ÉÄܱ£Áô¿Õ°×½áµã. È»¶ø, Ëü²¢²»ºÏÊÊÀ´Êä³ö´óµÄÄ£ÐÍ. ÒòΪËüµÄÐÔÄܲ»¿ÉÄܱ»ÈËÃÇËù½ÓÊÜ. ÒªÊä³ö´óµÄÎļþºÍ±£Áô¿Õ°×½áµã, ¿ÉÒÔÓÃN-ÈýÔª×éµÄÐÎʽÊä³ö:
// now write the model in XML form to a file
model.write(System.out, "N-TRIPLE");
Õâ»á²úÉúÀàËÆÓÚTutorial3µÄÊä³ö, ´ËÊä³ö»á×ñÑN-ÈýÔª×éµÄ¹æ¸ñ.
________________________________________
¶ÁRDF
Tutorial 5 ÑÝʾÁËÈçºÎ½«ÓÃRDF XML¼Ç¼µÄ³ÂÊö¶ÁÈëÒ»¸öÄ£ÐÍ. ÔÚ´ËÀýÖÐ, ÎÒÃÇÌṩÁËÒ»¸öСÐÍRDF/XMLÐÎʽµÄvcardµÄÊý¾Ý¿â. ÏÂÃæ´úÂë»á½«Æä¶ÁÈëºÍд³ö. ×¢Òâ: Èç¹ûÒªÔËÐÐÕâ¸öС³ÌÐò, Ó¦¸Ã°ÑÊäÈëÎļþ·ÅÔÚÄãµÄclasspathËùÖ¸ÏòµÄĿ¼»òjarÖÐ.
// create an empty model
Model model = ModelFactory.createDefaultModel();
// use the class loader to find the input file
InputStream in = Tutorial05.class
.getClassLoader()
.getResourceAsStream(inputFileName);
if (in == null) {
throw new IllegalArgumentException(
"file: " + inputFileName + " not found");
}
// read the RDF/XML file
model.read(new InputStreamReader(in), "");
// write it to standard out
model.write(System.out);
read()·½·¨Öеĵڶþ¸ö²ÎÊýÊÇÒ»¸öURI, ËüÊDZ»ÓÃÀ´½â¾öÏà¶ÔURIµÄ. ÒòΪÔÚ²âÊÔÎļþÖÐûÓÐʹÓÃÏà¶ÔURI, ËùÒÔËüÔÊÐí±»ÖÃΪ¿ÕÖµ. ÔËÐÐʱ, Tutorial5»á²úÉúÀàËÆÈçϵÄXMLÊä³ö
<rdf:RDF
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
>
<rdf:Description rdf:nodeID="A0">
<vcard:Family>Smith</vcard:Family>
<vcard:Given>John</vcard:Given>
</rdf:Description>
<rdf:Description rdf:about='http://somewhere/JohnSmith/'>
<vcard:FN>John Smith</vcard:FN>
<vcard:N rdf:nodeID="A0"/>
</rdf:Description>
<rdf:Description rdf:about='http://somewhere/SarahJones/'>
<vcard:FN>Sarah Jones</vcard:FN>
<vcard:N rdf:nodeID="A1"/>
</rdf:Description>
<rdf:Description rdf:about='http://somewhere/MattJones/'>
<vcard:FN>Matt Jones</vcard:FN>
<vcard:N rdf:nodeID="A2"/>
</rdf:Description>
<rdf:Description rdf:nodeID="A3">
<vcard:Family>Smith</vcard:Family>
<vcard:Given>Rebecca</vcard:Given>
</rdf:Description>
<rdf:Description rdf:nodeID="A1">
<vcard:Family>Jones</vcard:Family>
<vcard:Given>Sarah</vcard:Given>
</rdf:Description>
<rdf:Description rdf:nodeID="A2">
<vcard:Family>Jones</vcard:Family>
<vcard:Given>Matthew</vcard:Given>
</rdf:Description>
<rdf:Description rdf:about='http://somewhere/RebeccaSmith/'>
<vcard:FN>Becky Smith</vcard:FN>
<vcard:N rdf:nodeID="A3"/>
</rdf:Description>
</rdf:RDF>
________________________________________
Jena RDF °ü
JenaÊÇÒ»¸öΪÓïÒåÍøÓ¦ÓÃÉè¼ÆµÄÒ»¸öJava API. ¶ÔÓ¦Óÿª·¢Õß¶øÑÔ, Ö÷Òª¿ÉÓõÄRDF°üÊÇcom.hp.hpl.jena.rdf.model. ÒòΪAPIÊÇÒԽӿڵķ½Ê½¶¨ÒåµÄ, ËùÒÔÓ¦ÓôúÂë¿ÉÒÔʹÓò»Í¬µÄʵÏÖ»úÖÆ¶ø²»Óøıä´úÂë±¾Éí. Õâ¸ö°ü°üº¬ÁË¿ÉÒÔ±íʾģÐÍ, ×ÊÔ´, ÊôÐÔ, Îı¾, ³ÂÊöºÍÆäËûRDF¹Ø¼ü¸ÅÄîµÄ½Ó¿Ú, »¹ÓÐÒ»¸öÓÃÀ´´´½¨Ä£Ð͵ÄModelFactory. ËùÒÔÈç¹ûÒªÓ¦ÓôúÂëÓëʵÏÖÀà±£³Ö¶ÀÁ¢, ×îºÃ¾¡¿ÉÄܵØÊ¹ÓýӿÚ, ¶ø²»ÒªÊ¹ÓÃÌØ¶¨µÄʵÏÖÀà.
com.hp.hpl.jena.Tutorial°ü°üº¬Á˱¾½Ì³ÌËùÓÐÀý×ÓÖÐʹÓõ½µÄ¹¤×÷Ô´´úÂë.
com.hp.hpl.jena.implÕâЩ°ü°üº¬ÁËÐí¶àÖ´ÐÐʱËù³£ÓõÄÖ´ÐÐÀà. ±ÈÈç, ËüÃǶ¨ÒåÁËÖîÈçResourseImpl, PropertyImplºÍLiteralImplµÄÀà, ÕâЩÀà¿ÉÒÔ±»²»Í¬µÄÓ¦ÓÃÖ±½ÓʹÓÃÒ²¿ÉÒÔ±»¼Ì³ÐʹÓÃ. Ó¦ÓóÌÐòÓ¦¸Ã¾¡¿ÉÄÜÉÙµØÖ±½ÓʹÓÃÕâЩÀà. ÀýÈç, ÓëÆäʹÓÃResouceImplÀ´´´½¨Ò»¸öеÄʵÀý, ¸üºÃµÄ°ì·¨ÊÇʹÓÃÈκÎÕýÔÚʹÓõÄÄ£Ð͵ÄcreateResource·½·¨À´Íê³É. ÄÇÑùµÄ»°, Èç¹ûÄ£Ð͵ÄÖ´ÐвÉÓÃÁËÒ»¸öÓÅ»¯µÄResouceÖ´ÐÐ, ÄÇôÔÚÕâÁ½ÖÖÀàÐÍÖв»ÐèÒªÓÐÈκεÄת»»¹¤×÷.
________________________________________
²Ù×ÝÄ£ÐÍ
µ½Ä¿Ç°ÎªÖ¹, ±¾½Ì³ÌÖ÷Òª½²ÊöµÄÊÇÈçºÎ´´½¨, ¶ÁÈëºÍÊä³öRDFÄ£ÐÍ. ÏÖÔÚÊÇʱºòÒª½²ÊöÈçºÎ·ÃÎÊÄ£ÐÍÖеÄÐÅÏ¢.
Èç¹ûÓÐÁËÒ»¸ö×ÊÔ´µÄURI, ÄÇô¾Í¿ÉÒÔÓÃModel.getResource(String uri)À´´ÓÄ£ÐÍ»ñÈ¡Õâ¸ö×ÊÔ´¶ÔÏó. Õâ¸ö·½·¨±»¶¨ÒåÀ´·µ»ØÒ»¸ö×ÊÔ´¶ÔÏó, Èç¹ûËüȷʵ´æÔÚÓÚÄ£ÐÍÖÐ, ·ñÔòµÄ»°¾Í´´½¨Ò»¸öеÄ. ÀýÈç, ÈçºÎ´ÓÄ£ÐÍÖлñÈ¡Adam Smith×ÊÔ´, Õâ¸öÄ£ÐÍÊÇTutorial5ÖдÓÎļþ¶ÁÈëµÄ:
// retrieve the John Smith vcard resource from the model
Resource vcard = model.getResource(johnSmithURI);
Resouce½Ó¿Ú¶¨ÒåÁËһϵÁÐÓÃÓÚ·ÃÎÊij¸ö×ÊÔ´µÄÊôÐԵķ½·¨. Resource.getProperty(Property p)·½·¨·ÃÎÊÁ˸Ã×ÊÔ´µÄÊôÐÔ. Õâ¸ö·½·¨²»ÔÊÐíͨ³£µÄJava·ÃÎʵÄת»», ÒòΪËù·µ»ØµÄ¶ÔÏóÊÇStatement, ¶ø²»ÊÇÄãËùÔ¤¼ÆµÄProperty. ·µ»ØÕû¸ö³ÂÊöµÄºÃ´¦ÊÇÔÊÐíÓ¦ÓóÌÐòͨ¹ýʹÓÃËüµÄij¸ö·ÃÎÊ·½·¨À´·ÃÎʸóÂÊöµÄ¿ÍÌåÀ´·ÃÎÊÕâ¸öÊôÐÔÖµ. ÀýÈçÈçºÎ»ñÈ¡×÷Ϊvcard:NÊôÐÔÖµµÄ×ÊÔ´:
// retrieve the value of the N property
Resource name = (Resource) vcard.getProperty(VCARD.N)
.getObject();
Ò»°ã¶øÑÔ, Ò»¸ö³ÂÊöµÄ¿ÍÌå¿ÉÒÔÊÇÒ»¸ö×ÊÔ´»òÊÇÒ»¸öÎı¾. ËùÒÔ´ËÓ¦ÓóÌÐò´úÂëÖªµÀÕâ¸öÖµÒ»¶¨ÊǸö×ÊÔ´, ¾Í½«ÀàÐÍ×ÊÔ´Ó³Éäµ½·µ»ØµÄ¶ÔÏóÉÏ. JenaµÄÄ¿±êÖ®Ò»ÊÇÌṩ»á·µ»ØÖµÎªÌض¨ÀàÐ͵ķ½·¨, ÕâÑù,Ó¦ÓóÌÐò¾Í²»±ØÔÙ×öÀàÐÍת»»¹¤×÷, Ò²²»±ØÔÙ±àÒëʱ×öÀàÐͼì²é¹¤×÷. ÒÔÉϵĴúÂëÆ¬¶ÎÒ²¿ÉÒÔд³É¸ü·½±ãµÄÐÎʽ:
// retrieve the value of the FN property
Resource name = vcard.getProperty(VCARD.N)
.getResource();
ÀàËÆµØ, ÊôÐÔµÄÎı¾ÖµÒ²¿ÉÒÔ±»»ñÈ¡:
// retrieve the given name property
String fullName = vcard.getProperty(VCARD.FN)
.getString();
ÔÚÕâ¸öÀý×ÓÖÐ, ×ÊÔ´vcardÖ»ÓÐÒ»¸övcard:FNÊôÐÔºÍÒ»¸övcard:NÊôÐÔ. RDFÔÊÐí×ÊÔ´ÓÐÖØ¸´µÄÊôÐÔ, ÀýÈçAdam¿ÉÄÜÓг¬¹ýÒ»¸öµÄêdzÆ. ÈÃÎÒÃǼÙÉèËûÓÐÁ½¸öêdzÆ:
// add two nickname properties to vcard
vcard.addProperty(VCARD.NICKNAME, "Smithy")
.addProperty(VCARD.NICKNAME, "Adman");
ÕýÈçÇ°ÃæËùÌáµ½µÄÄÇÑù, Jena½«RDFÄ£ÐͱíʾΪһ×é³ÂÊö, ËùÒÔÔÚÄ£ÐÍÖÐÐÂÔöÒ»¸öÓëÔÓгÂÊöÓÐ×ÅÏàͬµÄÖ÷Ìå,ν´ÊºÍ¿ÍÌåµÄ³ÂÊö²¢²»»áºóʲô×÷ÓÃ. JenaûÓж¨Òå»á·µ»ØÄ£ÐÍÖдæÔÚµÄÁ½¸öêdzÆÖеÄÄÄÒ»¸ö. Vcard.getProperty(VCARD.NICKNAME)µ÷ÓõĽá¹ûÊDz»È·¶¨µÄ. Jena»á·µ»ØÕâЩֵÖеÄijһ¸ö, µ«ÊDz¢²»±£Ö¤Á½´ÎÁ¬ÐøµÄµ÷Óûáͬһ¸öÖµ.
Ò»¸öÊôÐÔºÜÓпÉÄÜ»á³öÏÖ¶à´Î, ¶ø·½·¨Resource.listProperty(Property p)¿ÉÒÔÓÃÀ´·µ»ØÒ»¸öiterator, Õâ¸öiterator»áÁгöËùÓеÄÖµ. ´Ë·½·¨Ëù·µ»ØµÄiterator·µ»ØµÄ¶ÔÏóµÄÀàÐÍΪStatement.ÎÒÃÇ¿ÉÒÔÏñÕâÑùÁгöËùÓеÄêdzÆ:
// set up the output
System.out.println("The nicknames of \\""
+ fullName + "\\" are:");
// list the nicknames
StmtIterator iter = vcard.listProperties(VCARD.NICKNAME);
while (iter.hasNext()) {
System.out.println(" " + iter.nextStatement()
.getObject()
.toString());
}
´Ë´úÂë¿ÉÒÔÔÚTutorial6ÖÐÕÒµ½, ÔËÐкó»á²úÉúÈçÏÂÊä³ö:
The nicknames of "John Smith" are:
Smithy
Adman
Ò»¸ö×ÊÔ´µÄËùÓÐÊôÐÔ¿ÉÒÔÓò»´ø²ÎÊýµÄlistStatement()·½·¨Áгö.
________________________________________
²éѯģÐÍ
ǰһ½ÚÌÖÂÛÁËÈçºÎͨ¹ýÒ»¸öÓÐ×ÅÒÑÖªURIµÄ×ÊÔ´À´²Ù×ÝÄ£ÐÍ. ±¾½ÚÒªÌÖÂÛ²éѯģÐÍ. ºËÐĵÄJena APIÖ»Ö§³ÖһЩÓÐÏ޵IJéѯÔÓï. ¶ÔÓÚ¸üÇ¿´ó²éѯÉ豸RDQLµÄ½éÉܲ»ÔÚ´ËÎĵµÖÐ.
ÁгöÄ£ÐÍËùÓгÂÊöµÄModel.listStatements()·½·¨Ò²ÐíÊÇ×îÔʼµÄ²éѯģÐÍ·½Ê½. È»¶ø²¢²»ÍƼöÔÚ´óÐ͵ÄÄ£ÐÍÉÏʹÓÃÕâ¸ö·½·¨. ÀàËÆµÄÓÐModel.listSubjects(), µ«ÆäËù·µ»ØµÄiterator»áµü´úËùÓк¬ÓÐÊôÐÔµÄ×ÊÔ´, ÀýÈçÊÇһЩ³ÂÊöµÄÖ÷Ìå.
Model.listSubjectsWithProperty(Property p, RDFNode o)·½·¨Ëù·µ»ØµÄiteratorµø´úÁËËùÓоßÓÐÊôÐÔpÇÒpÊôÐÔµÄֵΪoµÄ×ÊÔ´. ÎÒÃÇ¿ÉÄÜ»áÔ¤¼ÆÊ¹ÓÃrdf:typeÊôÐÔÀ´ËÑË÷×ÊÔ´µÄÀàÐÍÊôÐÔÒÔ»ñµÃËùÓеÄvcard×ÊÔ´:
// retrieve all resource of type Vcard.
ResIterator iter = model.listSubjectsWithProperty(RDF.type, VCARD.Vcard);
È»¶ø, ²»ÐÒµÄÊÇ, ÎÒÃÇÏÖÔÚÕýÔÚʹÓõÄvcardģʽ²¢Ã»ÓÐΪvcard¶¨ÒåÀàÐÍ. È»¶ø, Èç¹ûÎÒÃǼÙÉèÖ»ÓÐÀàÐÍΪvcardµÄ×ÊÔ´²Å»áʹÓÃvcard:FNÊôÐÔ, ²¢ÇÒÔÚÎÒÃǵÄÊý¾ÝÖÐ, ËùÓдËÀà×ÊÔ´¶¼ÓÐÕâÑùÒ»¸öÊôÐÔ, ÄÇôÎÒÃǾͿÉÒÔÏñÕâÑùÕÒµ½ËùÓеÄvcard:
// list vcards
ResIterator iter = model.listSubjectsWithProperty(VCARD.FN);
while (iter.hasNext()) {
Resource r = iter.nextResource();
...
}
ËùÓеÄÕâЩ²éѯ·½·¨²»¹ýÊÇÔÚÔÓï²éѯ·½·¨model.listStatements(Select s)ÉÏÉÔ×ö±ä»¯¶øÒÑ. ´Ë·½·¨»á·µ»ØÒ»¸öiterator, ¸Ãiterator»áµø´úÄ£ÐÍÖÐËùÓб»sÑ¡ÖеijÂÊö. Õâ¸öselector½Ó¿Ú±»Éè¼Æ³É¿ÉÀ©Õ¹µÄ, µ«ÊÇĿǰ, ËüÖ»ÓÐÒ»¸öÖ´ÐÐÀà,ÄǾÍÊÇcom.hp.hpl.jena.rdf.model°üÖеÄSimpleSelectorÀà. ÔÚJenaÖÐʹÓÃSimpleSelectorÊǺÜÉÙ¼ûµÄÇé¿ö, ¼´µ±ÐèÒªÖ±½ÓʹÓÃÒ»¸öÌØ¶¨Àà¶ø²»ÊÇʹÓýӿÚ. SimpleSelectorµÄ¹¹Ô캯Êý´øÓÐÈý¸ö²ÎÊý:
Selector selector = new SimpleSelector(subject, predicate, object)
Õâ¸öselector»áÑ¡ÔñËùÓÐÖ÷ÌåÓë²ÎÊýsubjectÏàÅä, ν´ÊÓë²ÎÊýpredicateÏàÅä, ÇÒ¿ÍÌåÓë²ÎÊýobjectÏàÅäµÄ³ÂÊö.
Èç¹ûij¸ö²ÎÊýֵΪnull, ÔòËü±íʾÓëÈκÎÖµ¾ùÆ¥Åä; ·ñÔòµÄ»°, ËüÃÇ¾Í»áÆ¥ÅäÒ»ÑùµÄ×ÊÔ´»òÎı¾. (µ±Á½¸ö×ÊÔ´ÓÐÏàͬµÄURI»òÊÇͬһ¸ö¿Õ°×½áµãʱ, ÕâÁ½¸ö×ÊÔ´¾ÍÊÇÒ»ÑùµÄ; µ±Á½¸öÎı¾ÊÇÒ»ÑùµÄµ±ÇÒ½öµ±ËüÃǵÄËùÓгɷֶ¼ÊÇÒ»ÑùµÄ.) ËùÒÔ:
Selector selector = new SimpleSelector(null, null, null);
»áÑ¡ÔñÄ£ÐÍÖÐËùÓеijÂÊö.
Selector selector = new SimpleSelector(null, VCARD.FN, null);
»áÑ¡ÔñËùÓÐν´ÊΪVCARD.FNµÄ³ÂÊö, ¶ø¶ÔÖ÷ÌåºÍ¿ÍÌåûÓÐÒªÇó. ×÷Ϊһ¸öÌØÊâµÄËõд,
listStatements( S, P, O )
µÈͬÓë
listStatements( new SimpleSelector( S, P, O ) )
ÏÂÃæµÄ´úÂë¿ÉÒÔÔÚTutorial7ÖÐÕÒµ½, ÁоÙÁËÊý¾Ý¿âÖÐËùÓÐvcardÖеÄÈ«Ãû.
// select all the resources with a VCARD.FN property
ResIterator iter = model.listSubjectsWithProperty(VCARD.FN);
if (iter.hasNext()) {
System.out.println("The database contains vcards for:");
while (iter.hasNext()) {
System.out.println(" " + iter.nextStatement()
.getProperty(VCARD.FN)
.getString());
}
} else {
System.out.println("No vcards were found in the database");
}
Õâ¸ö»á²úÉúÀàËÆÈçϵÄÊä³ö:
The database contains vcards for:
Sarah Jones
John Smith
Matt Jones
Becky Smith
ÄãµÄÏÂÒ»¸öÁ·Ï°ÊÇÐ޸Ĵ˴úÂëÒÔʹÓÃSimpleSelector¶ø²»ÊÇʹÓÃlistSubjectsWithPropertyÀ´´ïµ½ÏàͬµÄЧ¹û.
ÈÃÎÒÃÇ¿´¿´ÈçºÎ¶ÔËùÑ¡ÔñµÄ³ÂÊöʵÐиüºÃµÄ¿ØÖÆ. SimpleSelector¿ÉÒÔ±»¼Ì³Ð, ËüµÄselect·½·¨¿ÉÒÔ±»ÐÞ¸ÄÀ´ÊµÏÖ¸üºÃµÄ¹ýÂË:
// select all the resources with a VCARD.FN property
// whose value ends with "Smith"
StmtIterator iter = model.listStatements(
new SimpleSelector(null, VCARD.FN, (RDFNode) null) {
public boolean selects(Statement s)
{return s.getString().endsWith("Smith");}
});
Õâ¸öʾÀýʹÓÃÁËÒ»¸ö¼ò½àµÄJava¼¼Êõ, ¾ÍÊǵ±´´½¨´ËÀàµÄÒ»¸öʵÀýÊ±ÖØÔØÒ»¸öÄÚÁªµÄ·½·¨. ÕâÀïselects(¡)·½·¨»á¼ì²éÒÔ±£Ö¤È«ÃûÒÔ"Smith"×ö½áβ. ÖØÒªµÄÊÇҪעÒâ¶ÔÖ÷Ìå, νÓïºÍ¿ÍÌåµÄ¹ýÂËÊÇÔÚµ÷ÓÃselects(¡)·½·¨Ö®Ç°µÄÖ´ÐеÄ, ËùÒÔ¶îÍâµÄ²âÊÔÖ»»á±»Ó¦ÓÃÓÚÆ¥ÅäµÄ³ÂÊö.
ÍêÕûµÄ´úÂë¿ÉÒÔÔÚTutorial8ÖÐÕÒµ½, ²¢»á²úÉúÈçϵÄÊä³ö:
The database contains vcards for:
John Smith
Becky Smith
ÄãÒ²Ðí»áÈÏΪÏÂÃæµÄ´úÂë:
// do all filtering in the selects method
StmtIterator iter = model.listStatements(
new
SimpleSelector(null, null, (RDFNode) null) {
public boolean selects(Statement s) {
return (subject == null || s.getSubject().equals(subject))
&& (predicate == null || s.getPredicate().equals(predicate))
&& (object == null || s.getObject().equals(object))
}
}
});
µÈͬÓÚ:
StmtIterator iter =
model.listStatements(new SimpleSelector(subject, predicate, object)
ËäÈ»ÔÚ¹¦ÄÜÉÏËüÃÇ¿ÉÄÜÊǵÈͬµÄ, µ«ÊǵÚÒ»ÖÖÐÎʽ»áÁоٳöÄ£ÐÍÖÐËùÓеijÂÊö, È»ºóÔÙ¶ÔËüÃǽøÐÐÖðÒ»µÄ²âÊÔ. ¶øµÚ¶þÖÖÐÎʽÔòÔÊÐíÖ´ÐÐʱ½¨Á¢Ë÷ÒýÀ´ÌṩÐÔÄÜ. Äã¿ÉÒÔÔÚÒ»¸ö´óÄ£ÐÍÖÐ×Ô¼ºÊÔÊÔÑéÖ¤Ò»ÏÂ, µ«ÊÇÏÖÔÚÏÈΪ×Ô¼ºµ¹Ò»±¿§·ÈÐÝϢһϰÉ.
________________________________________
¶ÔÄ£Ð͵IJÙ×÷
JenaÌṩÁ˰ÑÄ£Ð͵±×÷Ò»¸ö¼¯ºÏÕûÌåÀ´²Ù×ݵÄÈýÖÖ²Ù×÷·½·¨. ¼´ÈýÖÖ³£Óõļ¯ºÏ²Ù×÷:²¢, ½»ºÍ²î.
Á½¸öÄ£Ð͵IJ¢²Ù×÷¾ÍÊǰѱíʾÁ½¸öÄ£Ð͵ijÂÊö¼¯µÄ²¢²Ù×÷. ÕâÊÇRDFÉè¼ÆËùÖ§³ÖµÄ¹Ø¼ü²Ù×÷Ö®Ò». Ëü´Ë²Ù×÷ÔÊÐí°Ñ·ÖÀëµÄÊý¾ÝÔ´ºÏ²¢µ½Ò»Æð. ¿¼ÂÇÏÂÃæÁ½¸öÄ£ÐÍ:
ºÍ
µ±ËüÃDZ»ºÏ²¢Ê±, Á½¸öhttp://...JohnSmith»áºÏ²¢³ÉÒ»¸ö, ÖØ¸´µÄvcard:FN¼ýÍ·»á±»¶ªÆú, ´Ëʱ¾Í»á²úÉú:
ÈÃÎÒÃÇ¿´Ò»ÏÂÕâ¸ö´úÂëµÄ¹¦ÄÜ(ÍêÕûµÄ´úÂëÔÚTutorial9ÖÐ), ÔÙ¿´¿´»á·¢Éúʲô.
// read the RDF/XML files
model1.read(new InputStreamReader(in1), "");
model2.read(new InputStreamReader(in2), "");
// merge the Models
Model model = model1.union(model2);
// print the Model as RDF/XML
model.write(system.out, "RDF/XML-ABBREV");
petty writer»á²úÉúÈçϵÄÊä³ö:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#">
<rdf:Description rdf:about="http://somewhere/JohnSmith/">
<vcard:EMAIL>
<vcard:internet>
<rdf:value>John@...</rdf:value>
</vcard:internet>
</vcard:EMAIL>
<vcard:N rdf:parseType="Resource">
<vcard:Given>John</vcard:Given>
<vcard:Family>Smith</vcard:Family>
</vcard:N>
<vcard:FN>John Smith</vcard:FN>
</rdf:Description>
</rdf:RDF>
¼´±ãÄã²»ÊìϤRDF/XMLµÄÓ﷨ϸ½Ú, ÄãÈÔÈ»¿ÉÒÔÇå³þµÄ¿´¼ûÄ£ÐÍÈçͬԤÆÚ°ã±»ºÏ²¢ÁË. ÎÒÃÇ¿ÉÒÔÔÚÀàËÆµÄ·½Ê½ÏÂÔËËãÄ£Ð͵Ľ»²Ù×÷ºÍ²î²Ù×÷.
________________________________________
ÈÝÆ÷
RDF¶¨ÒåÁËÒ»ÀàÌØÊâµÄ×ÊÔ´À´±íʾÊÂÎïµÄ¼¯ºÏ. ÕâЩ×ÊÔ´³ÆÎªÈÝÆ÷. Ò»¸öÈÝÆ÷µÄ³ÉÔ±¿ÉÒÔÊÇ×ÊÔ´Ò²¿ÉÒÔÊÇÎı¾. ÓÐÈýÀàÈÝÆ÷:
Ò»¸öBAGÊÇÒ»¸öÎÞÐòµÄ¼¯ºÏ.
Ò»¸öALTÊÇÒ»¸öÓÃÀ´±íʾ±¸Ñ¡ÏîµÄÎÞÐòµÄ¼¯ºÏ.
Ò»¸öSEQÊÇÒ»¸öÓÐÐòµÄ¼¯ºÏ.
Ò»¸öÈÝÆ÷ÓÉÒ»¸ö×ÊÔ´±íʾ. ¸Ã×ÊÔ´»áÓÐÒ»¸ördf:typeÊôÐÔ, ÊôÐÔֵΪrdf:Bag, »òrdf:Alt, »òÊÇrdf:Seq, ÔÙ»òÊÇÕâЩÀàÐ͵Ä×ÓÀàÐÍ, ÕâÈ¡¾öÓÚÈÝÆ÷µÄÀàÐÍ. ÈÝÆ÷µÄµÚÒ»¸ö³ÉÔ±ÊÇÈÝÆ÷µÄrdf:_1µÄÊôÐÔËù¶ÔÓ¦µÄÊôÐÔÖµ; µÚ¶þ¸ö³ÉÔ±ÊÇÈÝÆ÷µÄrdf:_2ÊôÐÔµÄÖµ, ÒÀ´ËÀàÍÆ. ÕâЩrdf:_nnnÊôÐÔ±»³ÆÎªÐòÊýÊôÐÔ.
ÀýÈç, Ò»¸öº¬ÓÐSmithµÄvcardµÄ¼òµ¥bagÈÝÆ÷µÄÄ£ÐÍ¿ÉÄܻῴÆðÀ´ÊÇÕâÑùµÄ:
ËäÈ»bagÈÝÆ÷µÄ³ÉÔ±ÃDZ»rdf:_1,rdf_2µÈµÈµÄÊôÐÔËù±íʾ, µ«ÊÇÕâЩÊôÐÔµÄ˳ÐòÈ´²¢²»ÖØÒª. ¼´±ãÎÒÃǽ«rdf:_1ºÍrdf:_2µÄÊôÐÔÖµ½»»», µ«Êǽ»»»ºóµÄÄ£ÐÍÈÔÈ»±íʾÏàͬµÄÐÅÏ¢.
AltÊÇÉè¼ÆÓÃÀ´±íʾ±»Ñ¡ÏîµÄ. ÀýÈç, ÎÒÃǼٶ¨ÓÐÒ»¸ö±íʾÈí¼þ²úÆ·µÄ×ÊÔ´. Ëü¿ÉÄÜÓÐÒ»¸öÊôÐÔָʾ´ÓÄÄÀï¿ÉÒÔ»ñµÃ´ÎÈí¼þ²úÆ·. Õâ¸öÊôÐÔÖµ¿ÉÄÜÊÇÒ»¸ö°üº¬¸÷ÖÖÏÂÔØµØÖ·µÄAlt¼¯ºÏ. AltÊÇÎÞÐòµÄ, ³ýÁËrdf:_1ÊôÐÔÓÐ×ÅÌØÊâµÄÒâÒå, Ëü±íʾĬÈϵÄÑ¡Ïî.
¾¡¹ÜÎÒÃÇ¿ÉÒÔÓûù±¾µÄ×ÊÔ´ºÍÊôÐÔ»úÖÆÀ´´¦ÀíÈÝÆ÷, JenaΪ´¦ÀíÈÝÆ÷Éè¼ÆÁËÏÔʽµÄ½Ó¿ÚºÍÖ´ÐÐÀà. Òª±ÜÃâÔÚʹÓÃÒ»¸ö¶ÔÏóÀ´²Ù×÷ÈÝÆ÷µÄͬʱȥʹÓõͲ㷽·¨À´¸Ä±äÈÝÆ÷.
ÈÃÎÒÃÇÐÞ¸ÄTutorial8ÒÔ´´½¨Ò»¸öbag:
// create a bag
Bag smiths = model.createBag();
// select all the resources with a VCARD.FN property
// whose value ends with "Smith"
StmtIterator iter = model.listStatements(
new SimpleSelector(null, VCARD.FN, (RDFNode) null) {
public boolean selects(Statement s) {
return s.getString().endsWith("Smith");
}
});
// add the Smith's to the bag
while (iter.hasNext()) {
smiths.add(iter.next().getSubject());
}
Èç¹ûÎÒÃǽ«´ÎÄ£ÐÍÊä³ö¿ÉÒÔ¿´¼ûËüº¬ÓÐÀàËÆÈçϵijɷÖ:
<rdf:RDF
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:vcard='http://www.w3.org/2001/vcard-rdf/3.0#'
>
...
<rdf:Description rdf:nodeID="A3">
<rdf:type rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag'/>
<rdf:_1 rdf:resource='http://somewhere/JohnSmith/'/>
<rdf:_2 rdf:resource='http://somewhere/RebeccaSmith/'/>
</rdf:Description>
</rdf:RDF>
Õâ±íʾÁËBag×ÊÔ´.
ÈÝÆ÷½Ó¿ÚÌṩÁËÒ»¸öiteratorÀ´ÁоÙÈÝÆ÷µÄÄÚÈÝ:
// print out the members of the bag
NodeIterator iter2 = smiths.iterator();
if (iter2.hasNext()) {
System.out.println("The bag contains:");
while (iter2.hasNext()) {
System.out.println(" " +
(Resource) iter2.next())
.getProperty(VCARD.FN)
.getString());
}
} else {
System.out.println("The bag is empty");
}
²¢»á²úÉúÈçϵÄÊä³ö:
The bag contains:
John Smith
Becky Smith
±¾ÀýµÄ¿ÉÖ´ÐдúÂë¿ÉÒÔÔÚTutorial10ÖÐÕÒµ½.
JenaÀàËùÌṩµÄ²Ù×ÝÈÝÆ÷µÄ·½·¨°üÀ¨Ôö¼ÓгÉÔ±, ÔÚÈÝÆ÷Öмä²åÈëгÉÔ±ºÍɾ³ýÒÑÓеijÉÔ±. JenaÈÝÆ÷ÀàĿǰ±£Ö¤ËùʹÓõÄÐòÊýÊôÐÔÁбí»á´Órdf:_1¿ªÊ¼²¢ÇÒÊÇÏàÁÚµÄ. RDFºËÐŤ×÷С×é·ÅËÉÁË´ËÏîÏÞÖÆ, ÒÔÔÊÐíÓоֲ¿µÄÈÝÆ÷±íʾ. ËùÒÔÕâÊÇJena½«À´¿ÉÄÜ»áÐ޸ĵĵط½Ö®Ò».
________________________________________
¹ØÓÚÎı¾(Literals)ºÍÊý¾ÝÀàÐ͵ĸü¶à̽ÌÖ
RDFÎı¾(literals)²¢²»½ö½öÊǼòµ¥µÄ×Ö·û´®¶øÒÑ. Îı¾¿ÉÄÜÓÐÒ»¸öÓïÑÔ±êÇ©À´Ö¸Ê¾¸ÃÎı¾Ê¹ÓõÄÓïÑÔ. ÓÐÓ¢ÓïÓïÑÔ±êÇ©µÄÎı¾"chat"»á±»ÈÏΪÓëÓÐ×Å·¨ÓïÓïÑÔ±êÇ©µÄÎı¾"chat"ÊDz»Í¬µÄ. Õâ¸öÆæ¹ÖµÄÌØÐÔÊÇÔÓÐRDF/XMLÓï·¨²úÉúµÄØÍÏó(artefact).
ÁíÍâ, ÊÂʵÉϹ²ÓÐÁ½ÖÖÎı¾. ÔÚÒ»ÖÖÀï, ×Ö·û´®³É·ÖÖ»ÊǼòµ¥µÄ×Ö·û´®. ¶øÔÚÁíÒ»ÖÖÀï, ×Ö·û´®³É·Ö±»Ô¤¼ÆÎª¸ñʽÁ¼ºÃµÄXMLƬ¶Î. µ±Ò»¸öRDFÄ£Ðͱ»Ð´³ÉRDF/XMLÐÎʽʱ, Ò»¸öÌØÊâµÄʹÓÃparseType='Literal'µÄÊôÐÔ(attribute)¹¹Ôì»á±»Ê¹ÓÃÀ´±íʾËü.
ÔÚJenaÖÐ, µ±Ò»¸öÎı¾±»´´½¨Ê±, ÕâЩÊôÐԾͱ»ÉèÖÃÁË. ÀýÈç, ÔÚTutorial11ÖÐ:
// create the resource
Resource r = model.createResource();
// add the property
r.addProperty(RDFS.label, model.createLiteral("chat", "en"))
.addProperty(RDFS.label, model.createLiteral("chat", "fr"))
.addProperty(RDFS.label, model.createLiteral("<em>chat</em>", true));
// write out the Model
model.write(system.out);
»á²úÉú:
<rdf:RDF
xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
xmlns:rdfs='http://www.w3.org/2000/01/rdf-schema#'
>
<rdf:Description rdf:nodeID="A0">
<rdfs:label xml:lang='en'>chat</rdfs:label>
<rdfs:label xml:lang='fr'>chat</rdfs:label>
<rdfs:label xml:lang='en' rdf:parseType='Literal'><em>chat</em></rdfs:label>
</rdf:Description>
</rdf:RDF>
Èç¹ûÁ½¸öÎı¾±»ÈÏΪÊÇÏàͬµÄ, ËüÃÇÒ»¶¨¶¼ÊÇXMLµÄÎı¾»ò¶¼ÊǼòµ¥µÄÎı¾. ÁíÍâ, ËüÃÇÁ½¸öҪô¶¼Ã»ÓÐÓïÑÔ±êÇ©, ҪôÓÐÏàͬµÄÓïÑÔ±êÇ©. ¶Ô¼òµ¥µÄÎı¾¶øÑÔ, Á½ÕßµÄ×Ö·û´®Ò»¶¨ÊÇÏàͬµÄ. XMLÎı¾µÄµÈͬÓÐÁ½µãÒªÇó. µÚÒ», Ç°ÃæÌáµ½µÄÒªÇó±ØÐë±»Âú×ã²¢ÇÒ×Ö·û´®±ØÐëÏàͬ. µÚ¶þ, Èç¹ûËüÃÇ×Ö·û´®µÄcannonicalizationÒ»ÑùµÄ»°, ËüÃǾÍÊÇÒ»ÑùµÄ.(ÒëÕß×¢: ÕÒ²»µ½cannonicalizationÖÐÎĵĽâÊÍ.).
Jena½Ó¿ÚÒ²Ö§³ÖÀàÐÍÎÄ×Ö. ÀÏʽµÄ¶Ô´ýÀàÐÍÎÄ×ֵķ½·¨ÊǰÑËûÃǵ±³ÉÊÇ×Ö·û´®µÄËõд: ÓÐÀàÐ͵ÄÖµ»áͨ¹ýJavaµÄ³£Ó÷½·¨×ª»»Îª×Ö·û´®, ²¢ÇÒÕâЩ×Ö·û´®±»´æ´¢ÔÚÄ£ÐÍÖÐ. ÀýÈç, ¿ÉÒÔÊÔÒ»ÊÔ(×¢Òâ:¶ÔÓÚ¼òµ¥ÀàÐÍÎÄ×Ö, ÎÒÃÇ¿ÉÒÔÊ¡ÂÔ¶Ômodel.createLiteral(¡)µÄµ÷ÓÃ):
// create the resource
Resource r = model.createResource();
// add the property
r.addProperty(RDFS.label, "11")
.addProperty(RDFS.label, 11);
// write out the Model
model.write(system.out, "N-TRIPLE");
²úÉúµÄÊä³öÈçÏÂ:
_:A... <http://www.w3.org/2000/01/rdf-schema#label> "11" .
ÒòΪÁ½¸öÎı¾¶¼ÊÇ×Ö·û´®"11", ËùÒÔÖ»»áÓÐÒ»¸ö³ÂÊö±»Ìí¼Ó.
RDFºËÐŤ×÷С×鶨ÒåÁËÖ§³ÖRDFÊý¾ÝÀàÐ͵ĻúÖÆ. JenaÖ§³ÖÄÇЩʹÓÃÀàÐÍÎÄ×ֵĻúÖÆ; µ«ÊDZ¾½Ì³ÌÖв»»á¶Ô´ËÌÖÂÛ.
________________________________________
ÊõÓï±í
¿Õ°×½áµã
±íʾһ¸ö×ÊÔ´, µ«ÊDz¢Ã»ÓÐָʾ¸Ã×ÊÔ´µÄURI. ¿Õ°×½áµãµÄ×÷ÓÃÈçͬµÚÒ»Âß¼ÖеĴæÔÚ·ûºÏ±äÁ¿.
Dublin ºËÐÄ
Ò»¸ö¹ØÓÚÍøÂç×ÊÔ´µÄÔªÊý¾Ý±ê×¼. ¸üÏêϸµÄÐÅÏ¢¿ÉÒÔÔÚDublin Core web siteÕÒµ½.
Îı¾
Ò»¸ö¿ÉÒÔ×÷ΪÊôÐÔÖµµÄ×Ö·û´®.
¿ÍÌå
ÈýÔª×éµÄÒ»²¿·Ö, Ò²¾ÍÊdzÂÊöµÄÖµ.
ν´Ê
ÈýÔª×éµÄÊôÐÔ²¿·Ö.
ÊôÐÔ
ÊôÐÔ(property)ÊÇ×ÊÔ´µÄÒ»¸öÊôÐÔ(attribute). ÀýÈç, DC.titleÊÇÒ»¸öÊôÐÔ, RDF.typeÒ²ÊÇÒ»¸öÊôÐÔ.
×ÊÔ´
ij¸öʵÌå. Ëü¿ÉÒÔÊÇÒ»¸öÍøÂç×ÊÔ´, ÀýÈçÒ»¸öÍøÒ³; ËüÒ²¿ÉÒÔÊÇÒ»¸ö¾ßÌåµÄÎïÀí¶ÔÏó, ÀýÈçÒ»¿ÃÊ÷»òÒ»Á¾³µ; ËüÒ²¿ÉÒÔÊÇÒ»¸ö³éÏóµÄ¸ÅÄî, ÀýÈç¹ú¼ÊÏóÆå»ò×ãÇò. ×ÊÔ´ÓÉURIÃüÃû.
³ÂÊö
RDFÄ£ÐÍÖеÄÒ»¸ö¼ýÍ·, ͨ³£±»½âÀí½âΪһ¸öÊÂʵ
Ö÷Ìå
RDFÄ£ÐÍÖмýÍ·³ö·¢µãµÄÄǸö×ÊÔ´.
ÈýÔª×é
Ò»¸öº¬ÓÐÖ÷Ìå, ν´ÊºÍ¿ÍÌåµÄ½á¹¹. ÊdzÂÊöµÄÁíÒ»Öֳƺô.
________________________________________
½Å×¢
RDF×ÊÔ´µÄ±êÇ©¿ÉÒÔ°üÀ¨Ò»¸öƬ¶Î±êÇ©, ÀýÈçhttp://hostname/rdf/Tutorial/#ch-Introduction, ËùÒÔ, ÑϸñµØ½², Ò»¸öRDF×ÊÔ´ÊÇÓÉÒ»¸öURI±íʾµÄ.
Îı¾¿ÉÒÔ±íʾΪһ¸ö×Ö·û´®, Ò²¿ÉÒÔÓÐÒ»¸ö¿ÉÑ¡µÄÓïÑÔ±àÂëÀ´±íʾ¸Ã×Ö·û´®µÄÓïÑÔ. ÀýÈç, Îı¾¿ÉÄÜÓÐÒ»¸ö±íʾӢÓïµÄÓïÑÔ±àÂë"en", ¶øÎı¾"deux"¿ÉÄÜÓÐÒ»¸ö±íʾ·¨ÓïµÄÓïÑÔ±àÂë"fr".
________________________________________
×÷Õß: Brian McBride
¸üÐÂÈË: Daniel Boothby and Chris Dollin
$Id: index.html,v 1.11 2004/01/09 17:16:06 andy_seaborne Exp $
·ÒëÕß:april1019(ÕâÊÇÎҵķÒë,Ï£Íû¶Ô´ó¼ÒÓаïÖú)
<Íê>
²ÎÓëÌÖÂÛ±¾Ö÷Ìâ