比较版本

RDF 数据源 How-To

修订版 286515:

由 Freeopen 在 进行的修订 286515

修订版 226165:

由 Freeopen 在 进行的修订 226165

标题:
RDF 数据源 How-To
RDF 数据源 How-To
网址缩略名:
RDF_数据源_How-To
RDF_数据源_How-To
标签:
RDF
内容:

修订版 286515
修订版 226165
t7    <div class="warning">t
8      <p>
9        This article is at least partially outdated. Help bring i
>t up to date, if you can. <span class="comment">The XPCOM registr 
>ation parts and the "As of this writing, it is not currently poss 
>ible to implement JavaScript XPCOM components" comment seem outda 
>ted didn't check the whole article.</span> 
10      </p>
11    </div>
12    <p>
13      This document is a cookbook that describes how to create a 
><i>native, client-side datasource</i> that works with Mozilla's < 
>a href="cn/RDF">RDF</a> implementation. It supercedes (and borrow 
>s from) the <a class="external" href="http://www.mozilla.org/rdf/ 
>doc/rdfdatasources.html">original document</a> put together by <a 
> class="link-mailto" href="mailto:rjc@netscape.com">Robert Church 
>ill</a>. 
14    </p>
15    <h3 id="What_is_a_datasource.3F" name="What_is_a_datasource.3
>F"> 
16      What is a datasource?
17    </h3>
18    <p>
19      The "RDF universe" consists of a set of <i>statements</i> a
>bout Internet <i>resources</i>; for example, "my home page was la 
>st modified April 2nd", or "that news article was sent by Bob". I 
>n the most abstract sense, a <i>datasource</i> is a collection of 
> such statements. 
20    </p>
21    <p>
22      More concretely, a datasource is a <i>translator</i> that c
>an present information as a collection of RDF statements. For exa 
>mple, a "file system datasource" would translate the file system  
>into statements like "/tmp is a directory" and "/tmp/foo is conta 
>ined within /tmp". An "IMAP datasource" would use the IMAP protoc 
>ol to translate your mail server's inbox as a collection of state 
>ments like "message number 126's subject is 'make money fast on t 
>he Internet'" and "message number 126 was sent by <a class=" link 
>-mailto" href="mailto:'spammer128@hotmail.com" rel="freelink">'sp 
>ammer128@hotmail.com</a>'". An "address book" datasource could tr 
>anslate a database file into statements like "<a class=" link-mai 
>lto" href="mailto:spammer128@hotmail.com's" rel="freelink">spamme 
>r128@hotmail.com's</a> real name is 'Billy Dumple'" and "<a class 
>=" link-mailto" href="mailto:spammer128@hotmail.com" rel="freelin 
>k">spammer128@hotmail.com</a> is considered an 'important friend' 
>." 
23    </p>
24    <p>
25      Statements from one datasource can be combined with stateme
>nts from another datasource using a <i>composite datasource</i>.  
>By combining statements from the IMAP datasource and address book 
> datasource, above, we'd be able to identify the sender of "messa 
>ge 126" as an "important friend". 
26    </p>
27    <h3 id="Deciding_on_a_vocabulary" name="Deciding_on_a_vocabul
>ary"> 
28      Deciding on a vocabulary
29    </h3>
30    <p>
31      The <i>vocabulary</i> is the set of properties that you wil
>l use to express relationships between elements (resources and li 
>terals) in your data model. The first question that you must answ 
>er is "should I use an existing vocabulary, or invent my own?" A  
>reasonable answer is, "use an existing vocabulary unless you <i>a 
>bsolutely must</i> invent your own." This will allow your datasou 
>rce to be integrated with other datasources with a minimum of eff 
>ort. 
32    </p>
33    <p>
34      There are several existing vocabularies of note, including:
35    </p>
36    <ul>
37      <li>
38        <a class="external" href="http://www.w3.org/TR/PR-rdf-sch
>ema/">The RDF Schema Specification</a>. This vocabulary is a "met 
>a vocabulary" that is used to specify other vocabularies. 
39      </li>
40      <li>
41        <a class="external" href="http://purl.oclc.org/dc/">The D
>ublin Core</a>. This vocabulary is useful for describing electron 
>ic resources. It contains elements for authorship, subject, publi 
>cation date, etc. 
42      </li>
43    </ul>
44    <h3 id="Mapping_your_data_to_nodes_and_arcs" name="Mapping_yo
>ur_data_to_nodes_and_arcs"> 
45      Mapping your data to nodes and arcs
46    </h3>
47    <p>
48      <b>{{ mediawiki.external('write me!') }}</b>
49    </p>
50    <h3 id="Implementing_the_nsIRDFDataSource_interface" name="Im
>plementing_the_nsIRDFDataSource_interface"> 
51      Implementing the <tt>nsIRDFDataSource</tt> interface
52    </h3>
53    <p>
54      Your first chore will be to implement the <tt><a class="ext
>ernal" href="http://lxr.mozilla.org/seamonkey/source/rdf/base/idl 
>/nsIRDFDataSource.idl">nsIRDFDataSource</a></tt> interface. There 
> are basically two approaches that you can take in this endeavor: 
55    </p>
56    <ol>
57      <li>
58        <p>
59          <i>Delegate to an inner proxy</i>. For example, you may
> choose to delegate to the <i>in-memory datasource</i>, which is  
>a generic datasource that implements <tt>nsIRDFDataSource</tt>. 
60        </p>
61        <p>
62          Typically, you provide a parser for reading in some sor
>t of static storage (e.g., a data file); the parser translates th 
>e datafile into a series of calls to <tt>Assert()</tt> to set up  
>the in-memory datasource. When <tt>Flush()</tt> is called, or the 
> last reference to the datasource is released, a routine walks th 
>e in-memory datasource and re-serializes the graph back to the or 
>iginal file format. For examples of an implementation like this,  
>look at the <a class="external" href="http://lxr.mozilla.org/seam 
>onkey/source/rdf/base/src/nsRDFXMLDataSource.cpp">RDF/XML datasou 
>rce</a> or the <a class="external" href="http://lxr.mozilla.org/s 
>eamonkey/source/xpfe/components/bookmarks/src/nsBookmarksService. 
>cpp">bookmarks datasource</a>. 
63        </p>
64        <p>
65          You may want to choose this implementation if your prim
>ary goal is to "wrap" a legacy data store. This implementation ma 
>y cause problems if your data store can be modified "on the fly"  
>by other agents. 
66        </p>
67      </li>
68      <li>
69        <p>
70          <i>Aggregate the in-memory datasource</i>. This is an e
>xtreme case of delegation, where you use XPCOM <i>aggregation</i> 
> to implement the <tt>nsIRDFDataSource</tt> interface. See <a hre 
>f="cn/Aggregating_the_In-Memory_Datasource">Aggregating the In-Me 
>mory Datasource</a> for technical details. 
71        </p>
72        <p>
73          If you take this approach, you won't be able to selecti
>vely implement methods of the <tt>nsIRDFDataSource</tt> interface 
>; instead, <i>all</i> of the methods will be "forwarded" to the i 
>n-memory datasource. This can be useful if your datasource is "re 
>ad-only", and you aren't worried about modification using <tt>Ass 
>ert()</tt>, etc. 
74        </p>
75      </li>
76      <li>
77        <p>
78          <i>Implement the interface yourself</i>. If you choose 
>this route, you'll need to implement each of the <tt>nsIRDFDataSt 
>ore</tt> methods "by hand". Although this is more work, it is rea 
>lly the only way to create a "live" datasource that may be change 
>d by some outside agent. 
79        </p>
80        <p>
81          The <a class="external" href="http://lxr.mozilla.org/se
>amonkey/source/rdf/datasource/src/nsFileSystemDataSource.cpp">fil 
>e system datasource</a> and <a class="external" href="http://lxr. 
>mozilla.org/seamonkey/source/mailnews/base/src/nsMsgFolderDataSou 
>rce.cpp">local mail datasource</a> are good examples of datasourc 
>es that have been implemented this way. 
82        </p>
83        <p>
84          You'll probably need to choose this implementation if y
>our datasource is "live", and may be modified or altered by some  
>outside agent (e.g., new mail arriving). You may also need to cho 
>ose this implementation if the data set which your datasource is  
>modeling is too large to fit in to memory (e.g., the entire file  
>system structure). 
85        </p>
86      </li>
87    </ol>
88    <p>
89      <b>{{ mediawiki.external('More info on what each method nee
>ds to do <i>here</i>') }}</b> 
90    </p>
91    <h4 id="RDF_Commands" name="RDF_Commands">
92      RDF Commands
93    </h4>
94    <p>
95      <b>{{ mediawiki.external('Describe what commands are, and w
>hy you\'d implement them.') }}</b> 
96    </p>
97    <h3 id="Registering_the_datasource_component" name="Registeri
>ng_the_datasource_component"> 
98      Registering the datasource component
99    </h3>
100    <p>
101      A datasource is an <a href="cn/XPCOM">XPCOM</a> component. 
>As such, it must (currently, see <a href="#footnote1">{{ mediawik 
>i.external(1) }}</a>) have: 
102    </p>
103    <ol>
104      <li>An XPCOM <i>CLSID</i> to identify the data source imple
>mentation 
105      </li>
106      <li>An implementation class (that corresponds to the CLSID)
> whose code lives in a DLL. The DLL must be located in the XPCOM  
><tt>components</tt> directory 
107      </li>
108      <li>A <i>factory</i> that is <i>registered</i> to an XPCOM 
><i>ProgID</i> in order to be instantiated from the repository. 
109      </li>
110    </ol>
111    <p>
112      Constructing a DLL for a component is beyond the scope of t
>his document; the reader is referred to <a class="external" href= 
>"http://lxr.mozilla.org/seamonkey/source/rdf/build/nsRDFFactory.c 
>pp">the RDF factory</a> as a guideline. 
113    </p>
114    <p>
115      Registering an RDF datasource is fairly simple: in the DLL'
>s <tt>NSRegisterSelf()</tt> method, you simply call the <i>compon 
>ent manager'</i>s <tt>RegisterComponent()</tt> method: 
116    </p>
117    <pre class="eval">
118extern "C" PR_IMPLEMENT(nsresult)
119NSRegisterSelf(nsISupports* aServiceManager, const char* aPath)
120{
121   nsresult rv;
122   ...
123   // Assume compMgr refers to the component manager
124   rv = compMgr-&gt;RegisterComponent(kMyDataSourceCID,
125            "My Data Source",
126            NS_RDF_DATASOURCE_PROGID_PREFIX "my-datasource",
127            aPath, PR_TRUE, PR_TRUE);
128   ...
129}
130</pre>
131    <p>
132      Replace <tt>kMyDataSourceCID</tt> with your datasource's CL
>SID. Replace <tt>"My Data Source"</tt> with a descriptive string  
>that should appear in the registry. Finally, replace <tt>"my-data 
>source"</tt> with a value appropriate for your datasource. This v 
>alue, when prefixed with <tt>"rdf:"</tt>, is a <i>datasource iden 
>tifier</i>, and may be used with <tt><a class="external" href="ht 
>tp://lxr.mozilla.org/seamonkey/source/rdf/base/idl/nsRDFInterface 
>s.idl#384">nsIRDFService::GetDataSource()</a></tt> to retrieve yo 
>ur datasource from the RDF service. For example, the above dataso 
>urce would be accessable as follows: 
133    </p>
134    <pre class="eval">
135nsIRDFService* rdf;
136rv = nsServiceManager::GetService(kRDFServiceCID,
137          kIRDFServiceIID,
138          (nsISupports**) &amp;rdf);
139 
140if (NS_SUCCEEDED(rv)) {
141    nsIRDFDataSource* myDataSource;
142    rv = rdf-&gt;GetDataSource("rdf:my-datasource",
143                 &amp;myDataSource);
144 
145    if (NS_SUCCEEDED(rv)) {
146        // ...do something to myDataSource here...
147        NS_RELEASE(myDataSource);
148    }
149    nsServiceManager::ReleaseService(kRDFServiceCID, rdf);
150}
151</pre>
152    <h3 id="Displaying_RDF_as_content" name="Displaying_RDF_as_co
>ntent"> 
153      Displaying RDF as content
154    </h3>
155    <p>
156      Now that you've gone through all this pain to expose your i
>nformation as a datasource, you probably want to <i>see</i> it. U 
>sing <a class="external" href="http://www.mozilla.org/xpfe/langua 
>geSpec.html">XUL</a>, you can display the contents of your dataso 
>urce in a <i>tree</i> control<i>, a</i> menu<i>, or a</i> toolbar 
><i>. In fact, you can</i> convert RDF to an <i>arbitrary</i> cont 
>ent model using <a href="cn/XUL/Template_Guide">XUL Templates</a> 
>. 
157    </p>
158    <p>
159      The following XUL fragment illustrates how to instantiate a
> tree control whose body is "rooted" to a resource (<tt><a class= 
>" external" href="http://foo.bar.com/" rel="freelink">http://foo. 
>bar.com/</a></tt>) that your datasource describes: 
160    </p>
161    <pre class="eval">
162&lt;window
163  xmlns:html="<a class=" external" href="http://www.w3.org/1999/x
>html" rel="freelink">http://www.w3.org/1999/xhtml</a>" 
164  xmlns:rdf="<a class=" external" href="http://www.w3.org/TR/WD-r
>df-syntax#" rel="freelink">http://www.w3.org/TR/WD-rdf-syntax#</a 
>>" 
165  xmlns="<a class=" external" href="http://www.mozilla.org/keymas
>ter/gatekeeper/there.is.only.xul" rel="freelink">http://www.mozil 
>la.org/keymaster/gat...re.is.only.xul</a>"&gt; 
166 
167  &lt;tree <b>datasources="rdf:my-datasource" ref="<a class=" ext
>ernal" href="http://foo.bar.com/" rel="freelink">http://foo.bar.c 
>om/</a>"</b>&gt; 
168    <b>&lt;template&gt;</b>
169      <b>&lt;treechildren&gt;</b>
170        <b>&lt;treeitem uri="..."&gt;</b>
171          <b>&lt;treerow&gt;</b>
172            <b>&lt;treecell&gt;</b>
173              <b>&lt;text value="rdf:<a class=" external" href="h
>ttp://home.netscape.com/NC-rdf#Name" rel="freelink">http://home.n 
>etscape.com/NC-rdf#Name</a>" /&gt;</b> 
174            <b>&lt;/treecell&gt;</b>
175            <b>&lt;treecell&gt;</b>
176              <b>&lt;text value="rdf:<a class=" external" href="h
>ttp://home.netscape.com/NC-rdf#URL" rel="freelink">http://home.ne 
>tscape.com/NC-rdf#URL</a>" /&gt;</b> 
177            <b>&lt;/treecell&gt;</b>
178          <b>&lt;/treerow&gt;</b>
179        <b>&lt;/treeitem&gt;</b>
180      <b>&lt;/treechildren&gt;</b>
181    <b>&lt;/template&gt;</b>
182 
183    &lt;treehead&gt;
184      &lt;treeitem&gt;
185        &lt;treecell&gt;Name&lt;/treecell&gt;
186        &lt;treecell&gt;URL&lt;/treecell&gt;
187      &lt;/treeitem&gt;
188    &lt;/treehead&gt;
189 
190    &lt;!-- treechildren built _here_ --&gt;
191  &lt;/tree&gt;
192 
193&lt;/window&gt;
194</pre>
195    <p>
196      The important "magic attributes" have been called out in bo
>ld, above: 
197    </p>
198    <ul>
199      <li>
200        <p>
201          <tt>datasources="rdf:my-datasource"</tt>. This is a spa
>ce-separated list that may include internal XPCOM datasource "ide 
>ntifiers" (as described above) and URIs for local or remote RDF/X 
>ML documents. Each datasource that is listed will be loaded, and  
>the assertions contained in the datasource will be made available 
> to the tree control for display. 
202        </p>
203      </li>
204      <li>
205        <p>
206          <tt>ref="<a class=" external" href="http://foo.bar.com/
>" rel="freelink">http://foo.bar.com/</a>"</tt>. This roots the gr 
>aph in your content model. The <tt>tree</tt> tag will be treated  
>as if it has the <tt>ID</tt> attribute with a value <tt><a class= 
>" external" href="http://foo.bar.com/" rel="freelink">http://foo. 
>bar.com/</a></tt>. 
207        </p>
208      </li>
209      <li>
210        <p>
211          <tt>&lt;template&gt;...&lt;/template&gt;</tt>. The XUL 
><i>template</i> that is used to build content from the graph. Sta 
>rting with the resource that corresponds to the <tt>tree</tt> ele 
>ment, <tt><a class=" external" href="http://foo.bar.com/" rel="fr 
>eelink">http://foo.bar.com/</a></tt>, the graph will be traversed 
> and content will be constructed using the pattern specified with 
>in the <tt>template</tt> tags. 
212        </p>
213      </li>
214    </ul>
215    <p>
216      For a complete description of how content is built from RDF
>, see the <a href="cn/XUL/Template_Guide">XUL:Template Guide</a>. 
217    </p>
218    <hr>
219    <p>
220      <small><sup id="footnote1">1</sup> As of this writing, it i
>s not currently possible to implement JavaScript XPCOM components 
>; however, it may soon be possible to do so via <a href="cn/XPCon 
>nect">XPConnect</a>. <strong>Update:</strong> JavaScript XPCOM sh 
>ould now be possible.</small> 
221    </p>
222    <p>
223      Contact: <a class="link-mailto" href="mailto:waterson@netsc
>ape.com">Chris Waterson</a> <a class=" link-mailto" href="mailto: 
>(waterson@netscape.com)" rel="freelink">(waterson@netscape.com)</ 
>a> 
224    </p>
225    <div class="originaldocinfo">
226      <h2 id="Original_Document_Information" name="Original_Docum
>ent_Information"> 
227        Original Document Information
228      </h2>
229      <ul>
230        <li>Author(s): <a class="link-mailto" href="mailto:waters
>on@netscape.com">Chris Waterson</a> 
231        </li>
232        <li>Last Updated Date: June 19, 2000
233        </li>
234        <li>Copyright Information: Copyright (C) <a class="link-m
>ailto" href="mailto:waterson@netscape.com">Chris Waterson</a> 
235        </li>
236      </ul>
237    </div>

返回历史