<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>edifiersql的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=edifiersql</link>
<description>edifiersql的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[[收藏]使用 Jena API 处理 RDF -- 作者：admin]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=edifiersql&amp;id=3541</link>
<author>edifiersql</author>
<pubDate>2005/3/12 1:24:17</pubDate>
<description><![CDATA[本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=3&amp;ID=6475&amp;replyID=10417&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=admin" target=_blank>admin</A><BR>以下为原文：<BR><BR><B>使用 Jena API 处理 RDF</B><BR><BR><A class=contentlink href="http://cmpp.linuxforum.net/XML/rdf.html" target=_blank>http://cmpp.linuxforum.net/XML/rdf.html</A>
<P></P>
<P><FONT size=4>使用 Jena API 处理 RDF</FONT></P>
<P>作者：Joe Verzulli<BR>发表时间：2001年5月23日<BR>原文链接：<A class=contentlink href="http://www.xml.com/pub/a/2001/05/23/jena.html" target=_blank>http://www.xml.com/pub/a/2001/05/23/jena.html</A><BR>译者：dlee<BR>翻译时间：2001年5月26日</P>
<P>对于 RDF (资源定义框架) 的兴趣正在日渐增长，很多用于处理 RDF 的工具和开发库已经被开发出来。这篇文章描述了一个这样的开发库，Jena，用于处理 RDF 的一套 Java API，它也是一个实现这套 API 的开放源码软件的名字。</P>
<P><B>什么是 RDF？</B></P>
<P>XML 非常灵活，它允许信息以很多种不同的方式来编码。如果使用有意义的标记，对于人来确定一个 XML 字符串的含义就会相对容易。尽管如此，对于程序来说确定一个 XML 字符串的含义仍然是困难的，因为程序并不懂得英文的标记名。DTD 和 XML Schema 对于这一问题并非真正有帮助，它们只是允许一个程序来验证一个 XML 字符串是否符合某个规则集合。<BR>RDF (RDFMS ，Bray， Ogbuji，SWARDF) 是一个以一种允许程序懂得文档意图表现的含义的方式来表现信息的模型和 XML 语法。它建立在一个 statement，即具有形式{predicate, subject, object} 的一个三元组的概念之上。对于一个三元组的解释是 &lt; subject&gt; 有一个属性 &lt; predicate&gt;，属性值是 &lt; object&gt;。statement 的例子是 {numberOfHits, <A class=contentlink href="http://www.foo.com/index.html" target=_blank>http://www.foo.com/index.html</A>, 3000} 和 {title, <A class=contentlink href="http://bookstore.com/book12" target=_blank>http://bookstore.com/book12</A>, "The Connoisseur's Guide to the Mind"}。在 RDF 中一个 总是一个以 URL 来命名的资源，这个 URL 有一个可选的锚 id。&lt; predicate&gt; 是资源的一个属性，&lt; object&gt; 是资源属性的值。</P>
<P>考虑下面的三元组 (这里 dc 前缀的含义是 Dublin Core)</P>
<P>{dc:Publisher, <A class=contentlink href="http://www.w3.org/" target=_blank>http://www.w3.org</A>, "World Wide Web Consortium"}<BR>{dc:Title, <A class=contentlink href="http://www.w3.org/" target=_blank>http://www.w3.org</A>, "W3C Home Page"}</P>
<P>这些三元组能够被图形化地表示为这样</P>
<P>[graph1]</P>
<P>在这个图形中弧线被标记为 predicate。每条弧线从一个代表 subject 的节点出发，终止于一个代表 object 的节点。三元组和图形是同一 RDF 数据模型的两种不同表示。</P>
<P>对于这个模型也有一个 XML 的表示。RDF 要求不同类别的语义信息 (例如，题目，属性和值) 被放置在 XML 中指定的地点。 读取一个 XML 编码的 RDF 程序随后可以确定是否一个特定的元素或属性指示一个主题，一个属性或一个属性的值。</P>
<P><B>Jena API</B></P>
<P>Jena 由 HP 公司的 Brian McBride 开发，起源于早些时候 SiRPAC API 的工作。Jena 允许你来解析，创建和查询 RDF 模型。</P>
<P>Jena 定义了很多的接口来访问和处理 RDF statement，如下图所示</P>
<P>[image2]</P>
<P>RDFNode 接口为所有的可以作为一个 RDF 三元组一部分的元素提供了一个公共的基础。Literal 接口表示字面值，例如 “red fish” 或 225，可以被用来作为 {predicate, subject, object} 三元组中的 &lt; object&gt;。Literal 接口提供了将字面值转换为诸如 String，int 和 double 这样的 Java 类型的访问方法。</P>
<P>实现 Property 接口的对象可以作为 {predicate, subject, object} 三元组中的 &lt; predicate&gt;。</P>
<P>Statement 接口表示一个 {predicate, subject, object} 三元组。它也可以被用来作为一个三元组中的 &lt; object&gt;，因为 RDF 允许 statement 嵌套。<BR>实现 Container，Alt，Bag 或 Seq 的对象可以作为三元组中的 &lt; object&gt;。</P>
<P><B>使用 Jena 解析 RDF</B></P>
<P>一个 RDF 非常有用的领域是在 Web 页面中嵌入元数据。这个 RDF 能够被编码为嵌入在 XHTML 页面中的 XML。<BR>一个了解 RDF 的搜索引擎能够使用这些元数据来给出比一个仅仅靠关键字匹配的搜索引擎给出的更加关联的结果。一个了解 RDF 的搜索引擎爬虫能够使用 Jena 来解析 RDF，这由 Model 接口里的 read() 方法来完成，就象以下代码显示的那样(为清晰起见，例外处理已被省略)</P>
<P>File f;<BR>FileReader fr;<BR>Model model;</P>
<P>f = new File("C:\\test1.html");<BR>fr = new FileReader(f);<BR>model = new ModelMem();<BR>model.read(fr, RDFS.getURI());</P>
<P>在这个例子中，C:\test.html 是一个有 RDF 在 元素中的 XHTML 文件。Jena 自动提取 RDF 并忽略 XHTML 的其余部分。解析的结果是一个包含文件中三元组的 RDF 模型。这个模型随后可以被查询。<BR>代码片段中声明之后的前两个语句将 fr 设置为一个与 C:\test.html 相关联的 FileReader。model 被设置为一个 ModelMem 类的实例。ModelMem 是一个 Jena 提供的类，实现 Model 接口，使用主内存来存储模型。其它的实现也是可能的；例如，你可以创建一个基于事务处理数据库的实现。</P>
<P><B>从一个模型中得到所有的 Statements</B></P>
<P>一旦一个搜索引擎爬虫创建了一个包含一个 Web 页面元数据的 RDF 模型，它需要添加每个三元组到它的索引中，这样以后搜索就可以找到这个页面。这可以由 Model 接口的 listStatements() 方法来完成。listStatement() 返回一个 StmtIterator 来迭代模型中的每个 statement。它可以象这样来使用</P>
<P>Model model;<BR>StmtIterator iter;<BR>Statement stmt;<BR>.<BR>.<BR>.<BR>iter = model.listStatements();<BR>while (iter.hasNext()) {<BR>stmt = iter.next();<BR>// Now use <BR>}</P>
<P>Statement 接口提供了访问 satement 中 predicate，subject 和 object 的方法，如下所示</P>
<P>Property predicate;<BR>Resource subject;<BR>RDFNode obj;<BR>Statement stmt;<BR>.<BR>.<BR>.<BR>subject = stmt.getSubject();<BR>System.out.println("Subject = " + subject.getURI());<BR>predicate = stmt.getPredicate();<BR>System.out.println("Predicate = " +predicate.getLocalName());<BR>obj = stmt.getObject();<BR>System.out.println("Object = " + obj.toString());</P>
<P><B>添加 Statement 到一个模型</B></P>
<P>并非所有应用程序都从 XML 或 XHTML 文件中读取 RDF，很多需要创建基于用户输入或其它数据的 RDF Statement。考虑一个用来维护 email 消息，浏览器书签和日历条目的可查询档案库的 RDF 个人信息管理器。当程序接收到一个新的 email 消息时，它能够提取出发送者和主题，为其创建 RDF 三元组。它也允许用户输入关于消息讨论的主题的信息，并创建包含该主题的 RDF 三元组。</P>
<P>下面的代码演示了 Jena 怎样能够用来在一个模型中创建三元组</P>
<P>Model model;<BR>String namespace = "<A class=contentlink href='http://www.test.com";/' target=_blank>http://www.test.com";</A><BR>.<BR>.<BR>.<BR>model.createResource("<A class=contentlink href="http://www.foo.com/boats" target=_blank>http://www.foo.com/boats</A>#sailboat")<BR>.addProperty(model.createProperty(namespace, "length"), 25)<BR>.addProperty(model.createProperty(namespace, "color"), "teal");</P>
<P>这段代码添加了下面的 statements 到模型中</P>
<P>{x:length, <A class=contentlink href="http://www.foo.com/boats" target=_blank>http://www.foo.com/boats</A>#sailboat, 25}<BR>{x:color, <A class=contentlink href="http://www.foo.com/boats" target=_blank>http://www.foo.com/boats</A>#sailboat, "teal"}</P>
<P>这里 x 是一个名域前缀，对应于名域的 URI <A class=contentlink href="http://www.test.com/" target=_blank>http://www.test.com</A></P>
<P><B>查询模型</B></P>
<P>一旦一个 RDF 模式被创建，我们需要一种方法来查询它，例如，考虑一个包含 RDF 元数据的旅游 FAQ。假设我们想找到所有与非洲旅行有关的问题，换句话说我们希望找到在模型中所有具有形式 {destination, res, Africa} 的 res 的值。下面的代码显示怎样完成这件事。它任意假设属性的目的地是在一个 <A class=contentlink href="http://foo.org/" target=_blank>http://foo.org</A> 的名域中。</P>
<P>Model model;<BR>Resource r;<BR>ResIterator resourceIter;<BR>.<BR>.<BR>.<BR>resourceIter = model.listSubjectsWithProperty(<BR>model.createProperty("<A class=contentlink href='http://foo.org/destination"' target=_blank>http://foo.org/destination"</A>),<BR>"Africa");<BR>while (resourceIter.hasNext()) {<BR>r = resourceIter.next();<BR>System.out.println("Resource " + r.toString() +<BR>" is about travel to Africa");<BR>}</P>
<P>listSubjectsWithProperty(p, v) 为任何 &lt; subject&gt; 查找所有的 {p, &lt; subject&gt;, v} 形式的三元组。它返回一个迭代匹配的三元组对象。</P>
<P><B>哪里能够得到 Jena</B></P>
<P>Jena 可以从这里下载 <A class=contentlink href="http://www.hpl.hp.co.uk/people/bwm/rdf/jena/download.htm" target=_blank>http://www.hpl.hp.co.uk/people/bwm/rdf/jena/download.htm</A> 。下载文件包括一些例子，JavaDoc，源代码和 jar 文件。</P>
<P><B>致谢</B></P>
<P>感谢 Brian McBride 为这篇文章的草稿所写的富有帮助的评论和创建了 Jena。</P>
<P><BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=3&amp;ID=6475&amp;replyID=10417&amp;skin=1" target=_blank>参与讨论本主题</A><BR></P>]]></description>
</item><item>
<title><![CDATA[[收藏]各位大虾高手，帮我看看这个RDF的语法错误吧，用jena不能读入数据库 -- 作者：小蜜蜂]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=edifiersql&amp;id=3540</link>
<author>edifiersql</author>
<pubDate>2005/3/12 0:51:54</pubDate>
<description><![CDATA[<P>本文转载自<A href="http://bbs.w3china.org/" target=_blank>W3CHINA.ORG讨论区</A>(BBS.W3CHINA.ORG)&nbsp;&nbsp;&nbsp;<A href="http://bbs.w3china.org/dispbbs.asp?boardid=2&amp;ID=12325&amp;replyID=30419&amp;skin=1" target=_blank>原文链接</A><BR>作者：<A href="http://bbs.w3china.org/dispuser.asp?name=小蜜蜂" target=_blank>小蜜蜂</A><BR>以下为原文：<BR><BR><B>各位大虾高手，帮我看看这个RDF的语法错误吧，用jena不能读入数据库</B><BR><BR>&lt;?xml version="1.0"?&gt;<BR>&lt;rdf:RDF<BR>xmlns="<A class=contentlink href="http://www.owl-ontologies.com/news.owl" target=_blank>http://www.owl-ontologies.com/news.owl</A>#"<BR>xmlns:rdf="<A class=contentlink href="http://www.w3.org/1999/02/22-rdf-syntax-ns" target=_blank>http://www.w3.org/1999/02/22-rdf-syntax-ns</A>#"<BR>xmlns:rdfs="<A class=contentlink href="http://www.w3.org/2000/01/rdf-schema" target=_blank>http://www.w3.org/2000/01/rdf-schema</A>#"<BR>xmlns:owl="<A class=contentlink href="http://www.w3.org/2002/07/owl" target=_blank>http://www.w3.org/2002/07/owl</A>#"<BR>xml:base="<A class=contentlink href='http://www.owl-ontologies.com/news.owl">' target=_blank>http://www.owl-ontologies.com/news.owl"&gt;</A><BR><BR>&lt;Media rdf:about="#AP" /&gt;<BR>&lt;Media rdf:about="#usatoday" /&gt;<BR>&lt;Media rdf:about="#Forbes" /&gt;<BR>&lt;Media rdf:about="#Reuters" /&gt;<BR>&lt;Media rdf:about="#BusinessWeek" /&gt; <BR>&lt;Media rdf:about="#CP" /&gt; <BR>&lt;Media rdf:about="#HealthDay" /&gt;<BR>&lt;Media rdf:about="#E! Online" /&gt; <BR>&lt;Media rdf:about="#LAUNCH" /&gt;<BR>&lt;Media rdf:about="#Ziff Davis" /&gt; <BR><BR>&lt;Person rdf:about="#Amanda Gardner" /&gt; <BR>&lt;Person rdf:about="#Amy Norton" /&gt; <BR>&lt;Person rdf:about="#Anthony J. Brown" /&gt; <BR>&lt;Person rdf:about="#BARRY SCHWEID" /&gt; <BR>&lt;Person rdf:about="#Bruce Schneier" /&gt; <BR>&lt;Person rdf:about="#BETH HARRIS" /&gt; <BR>&lt;Person rdf:about="#CHRIS SHERIDAN" /&gt;<BR>&lt;Person rdf:about="#CURT ANDERSON" /&gt; <BR>&lt;Person rdf:about="#Clint Willis" /&gt; <BR>&lt;Person rdf:about="#Dirk Smillie" /&gt; <BR>&lt;Person rdf:about="#David Lewis" /&gt; <BR>&lt;Person rdf:about="#DOUG TUCKER" /&gt; <BR>&lt;Person rdf:about="#ELLSWORTH CARTER" /&gt; <BR>&lt;Person rdf:about="#Finbarr O'Reilly" /&gt; <BR>&lt;Person rdf:about="#HAMZA HENDAWI" /&gt; <BR>&lt;Person rdf:about="#HOPE YEN" /&gt; <BR>&lt;Person rdf:about="#Guy Kewney" /&gt; <BR>&lt;Person rdf:about="#Glenn Somerville" /&gt; <BR>&lt;Person rdf:about="#Gene G. Marcial" /&gt;<BR>&lt;Person rdf:about="#James Cox" /&gt; <BR>&lt;Person rdf:about="#Kathleen Doheny" /&gt; <BR>&lt;Person rdf:about="#KIM HOUSEGO" /&gt; <BR>&lt;Person rdf:about="#Mark P. Mills" /&gt; <BR>&lt;Person rdf:about="#MARK SHERMAN" /&gt; <BR>&lt;Person rdf:about="#MICHAEL FELBERBAUM" /&gt;<BR>&lt;Person rdf:about="#Melinda Newman" /&gt; <BR>&lt;Person rdf:about="#MARI YAMAGUCHI" /&gt; <BR>&lt;Person rdf:about="#NANCY CARR" /&gt; <BR>&lt;Person rdf:about="#Nicole Maestri" /&gt; <BR>&lt;Person rdf:about="#JIM ABRAMS" /&gt; <BR>&lt;Person rdf:about="#JENNIFER LOVEN" /&gt; <BR>&lt;Person rdf:about="#Josh Grossberg" /&gt; <BR>&lt;Person rdf:about="#JENNIFER C. KERR" /&gt; <BR>&lt;Person rdf:about="#JAMES C. HELICKE" /&gt; <BR>&lt;Person rdf:about="#JOHN MARSHALL" /&gt; <BR>&lt;Person rdf:about="#Lyndsey Parker" /&gt; <BR>&lt;Person rdf:about="#LAURA WIDES" /&gt; <BR>&lt;Person rdf:about="#LARA SUKHTIAN" /&gt; <BR>&lt;Person rdf:about="#Paul Sexton" /&gt; <BR>&lt;Person rdf:about="#TOM RAUM" /&gt; <BR>&lt;Person rdf:about="#TIM ELFRINK" /&gt; <BR>&lt;Person rdf:about="#TED BRIDIS" /&gt; <BR>&lt;Person rdf:about="#Stephanie Nebehay" /&gt; <BR>&lt;Person rdf:about="#Sarah Hall" /&gt;<BR>&lt;Person rdf:about="#Steve Gorman" /&gt;<BR>&lt;Person rdf:about="#SAM HANANEL" /&gt; <BR>&lt;Person rdf:about="#Spencer Swartz" /&gt; <BR><BR>&lt;News rdf:about="<A class=contentlink href='http://story.news.yahoo.com/news?tmpl=story&amp;ncid=1387&amp;e=2&amp;u=/ap/20041122/ap_on_sp_bk_ne/bkn_pacers_pistons_brawl&amp;sid=95747870"/>' target=_blank>http://story.news.yahoo.com/news?tmpl=story&amp;ncid=1387&amp;e=2&amp;u=/ap/20041122/ap_on_sp_bk_ne/bkn_pacers_pistons_brawl&amp;sid=95747870"/&gt;</A><BR>&lt;hasSubject rdf:resource="#Basketball" /&gt;<BR>&lt;hasMedia rdf:resource="#AP" /&gt;<BR>&lt;hasAuthor rdf:resource="#CHRIS SHERIDAN" /&gt;<BR>&lt;title&gt; NBA Suspends Artest for Rest of Season &lt;/title&gt;<BR>&lt;pubDate&gt;Mon Nov 22, 2004 &lt;/pubDate&gt;<BR>&lt;link&gt; <A class=contentlink href="http://story.news.yahoo.com/news?tmpl=story&amp;ncid=1387&amp;e=2&amp;u=/ap/20041122/ap_on_sp_bk_ne/bkn_pacers_pistons_brawl&amp;sid=95747870" target=_blank>http://story.news.yahoo.com/news?tmpl=story&amp;ncid=1387&amp;e=2&amp;u=/ap/20041122/ap_on_sp_bk_ne/bkn_pacers_pistons_brawl&amp;sid=95747870</A> &lt;/link&gt;<BR>&lt;description &gt;The wrath of David Stern was unleashed, giving Ron Artest, Stephen Jackson and Jermaine O'Neal a long time — extremely long in Artest's case — to ponder the error of their ways. &lt;/description &gt;<BR>&lt;/News&gt;<BR><BR>&lt;News rdf:about="<A class=contentlink href='http://story.news.yahoo.com/news?tmpl=story&amp;cid=677&amp;ncid=1203&amp;e=1&amp;u=/usatoday/20041122/bs_usatoday/uswontacttoslowdollardrop"/>' target=_blank>http://story.news.yahoo.com/news?tmpl=story&amp;cid=677&amp;ncid=1203&amp;e=1&amp;u=/usatoday/20041122/bs_usatoday/uswontacttoslowdollardrop"/&gt;</A><BR>&lt;hasSubject rdf:resource="#Economy" /&gt;<BR>&lt;hasMedia rdf:resource="#usatoday" /&gt;<BR>&lt;hasAuthor rdf:resource="#James Cox" /&gt;<BR>&lt;title&gt; U.S. won't act to slow dollar drop &lt;/title&gt;<BR>&lt;pubDate&gt;Mon Nov 22, 2004 &lt;/pubDate&gt;<BR>&lt;link&gt; <A class=contentlink href="http://story.news.yahoo.com/news?tmpl=story&amp;cid=677&amp;ncid=1203&amp;e=1&amp;u=/usatoday/20041122/bs_usatoday/uswontacttoslowdollardrop" target=_blank>http://story.news.yahoo.com/news?tmpl=story&amp;cid=677&amp;ncid=1203&amp;e=1&amp;u=/usatoday/20041122/bs_usatoday/uswontacttoslowdollardrop</A> &lt;/link&gt;<BR>&lt;description &gt;Treasury Secretary John Snow urged European and Asian policymakers Sunday to adopt policies to trigger job growth, domestic spending and investment, and to not count on the United States to slow the dollar's decline in <I>value</I> against their currencies. &lt;/description &gt;<BR>&lt;/News&gt;<BR><BR>&lt;/rdf:RDF&gt;<BR><BR>&lt;完&gt;<BR><A href="http://bbs.w3china.org/dispbbs.asp?boardid=2&amp;ID=12325&amp;replyID=30419&amp;skin=1" target=_blank>参与讨论本主题</A></P>
<P>答案</P>
<P>&lt;News&nbsp;&nbsp;rdf:about="<A class=contentlink href='http://story.news.yahoo.com/news?tmpl=story&amp;ncid=1387&amp;e=2&amp;u=/ap/20041122/ap_on_sp_bk_ne/bkn_pacers_pistons_brawl&amp;sid=95747870"/>' target=_blank><FONT color=#4455aa>http://story.news.yahoo.com/news?tmpl=story&amp;ncid=1387&amp;e=2&amp;u=/ap/20041122/ap_on_sp_bk_ne/bkn_pacers_pistons_brawl&amp;sid=95747870"/&gt;</FONT></A><BR>这句结尾不需要"/"</P>
<P>因为这里的&nbsp;News&nbsp;element不是empty&nbsp;element</P>
<P><BR>&nbsp;</P>]]></description>
</item>
</channel>
</rss>