DDBJ-KEGG-PDBj: pdbx2owl.xsl

File pdbx2owl.xsl, 12.6 KB (added by akinjo, 14 years ago)

PDBML schema -> OWL ontology converter (XSL stylesheet)

Line 
1<?xml version="1.0" encoding="UTF-8" ?>
2<!DOCTYPE rdf:RDF [
3          <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
4          <!ENTITY owl "http://www.w3.org/2002/07/owl#">
5          <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
6          <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
7          ]>
8<xsl:stylesheet
9   version="1.0"
10   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
11   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
12   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
13   xmlns:PDBx="http://pdbml.pdb.org/schema/pdbx-v32.xsd"
14   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
15   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
16   xmlns:owl="http://www.w3.org/2002/07/owl#">
17  <xsl:output method="xml" indent="yes"/>
18  <xsl:strip-space elements="*"/>
19
20  <xsl:template match="/">
21    <rdf:RDF
22       xmlns:owl="http://www.w3.org/2002/07/owl#"
23       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
24       xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
25       xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
26       xmlns:PDBo="http://www.pdbj.org/schema/pdbx-v32.owl#"
27       >
28      <owl:Ontology rdf:about="">
29        <rdfs:label>PDBx ontology</rdfs:label>
30        <rdfs:comment>The PDBx OWL ontology translated from the PDBML schema.</rdfs:comment>
31      </owl:Ontology>
32
33      <owl:Class rdf:ID="CategoryElement">
34        <rdfs:label>CategoryElement</rdfs:label>
35        <rdfs:comment>Abstract class for category elements.</rdfs:comment>
36      </owl:Class>
37
38      <owl:DatatypeProperty rdf:ID="categoryItem">
39        <rdfs:label>categoryItem</rdfs:label>
40        <rdfs:comment>Abstract Datatype property for category items</rdfs:comment>
41        <rdfs:domain rdf:resource="#CategoryElement"/>
42      </owl:DatatypeProperty>
43
44      <owl:ObjectProperty rdf:ID="crossReference">
45        <rdfs:comment>Abstract property for cross-references.</rdfs:comment>
46      </owl:ObjectProperty>
47
48      <owl:ObjectProperty rdf:ID="reference_to">
49        <rdfs:comment>Abstract property for cross-references between categories.</rdfs:comment>
50        <rdfs:subPropertyOf rdf:resource="#crossReference"/>
51        <rdfs:domain rdf:resource="#CategoryElement"/>
52        <rdfs:range rdf:resource="#CategoryElement"/>
53      </owl:ObjectProperty>
54
55      <owl:ObjectProperty rdf:ID="link_to">
56        <rdfs:subPropertyOf rdf:resource="#crossReference"/>
57        <rdfs:comment>Abstract property for external links</rdfs:comment>
58      </owl:ObjectProperty>
59
60      <owl:ObjectProperty rdf:ID="link_to_pdb">
61        <rdfs:subPropertyOf rdf:resource="#link_to"/>
62        <rdfs:comment>link to related PDB entry</rdfs:comment>
63      </owl:ObjectProperty>
64
65      <owl:ObjectProperty rdf:ID="link_to_pubmed">
66        <rdfs:subPropertyOf rdf:resource="#link_to"/>
67        <rdfs:comment>external link to pubmed</rdfs:comment>
68      </owl:ObjectProperty>
69
70      <owl:ObjectProperty rdf:ID="link_to_sequence_db">
71        <rdfs:subPropertyOf rdf:resource="#link_to"/>
72        <rdfs:comment>external link to sequence databases</rdfs:comment>
73      </owl:ObjectProperty>
74
75      <owl:ObjectProperty rdf:ID="link_to_uniprot">
76        <rdfs:subPropertyOf rdf:resource="#link_to_sequence_db"/>
77        <rdfs:comment>external link to UniProt</rdfs:comment>
78      </owl:ObjectProperty>
79
80      <owl:ObjectProperty rdf:ID="link_to_genbank">
81        <rdfs:subPropertyOf rdf:resource="#link_to_sequence_db"/>
82        <rdfs:comment>external link to GenBank</rdfs:comment>
83      </owl:ObjectProperty>
84
85      <owl:ObjectProperty rdf:ID="link_to_embl">
86        <rdfs:subPropertyOf rdf:resource="#link_to_sequence_db"/>
87        <rdfs:comment>external link to EMBL</rdfs:comment>
88      </owl:ObjectProperty>
89
90      <owl:ObjectProperty rdf:ID="link_to_doi">
91        <rdfs:subPropertyOf rdf:resource="#link_to"/>
92        <rdfs:comment>external link to DOI (digital object identifier)</rdfs:comment>
93      </owl:ObjectProperty>
94
95      <owl:ObjectProperty rdf:ID="link_to_taxonomy">
96        <rdfs:subPropertyOf rdf:resource="#link_to"/>
97        <rdfs:comment>external link to NCBI taxonomy</rdfs:comment>
98      </owl:ObjectProperty>
99
100      <owl:ObjectProperty rdf:ID="link_to_taxonomy_source">
101        <rdfs:subPropertyOf rdf:resource="#link_to_taxonomy"/>
102        <rdfs:comment>external link to NCBI taxonomy (source organism)</rdfs:comment>
103      </owl:ObjectProperty>
104
105      <owl:ObjectProperty rdf:ID="link_to_taxonomy_host">
106        <rdfs:subPropertyOf rdf:resource="#link_to_taxonomy"/>
107        <rdfs:comment>external link to NCBI taxonomy (host organism)</rdfs:comment>
108      </owl:ObjectProperty>
109
110      <owl:ObjectProperty rdf:ID="link_to_enzyme">
111        <rdfs:subPropertyOf rdf:resource="#link_to"/>
112        <rdfs:comment>external link to enzyme code</rdfs:comment>
113      </owl:ObjectProperty>
114
115      <owl:ObjectProperty rdf:ID="link_to_go">
116        <rdfs:subPropertyOf rdf:resource="#link_to"/>
117        <rdfs:comment>external link to gene ontology</rdfs:comment>
118      </owl:ObjectProperty>
119
120      <xsl:apply-templates/>
121    </rdf:RDF>
122  </xsl:template>
123
124  <!-- schema root -->
125  <xsl:template match="xsd:schema">
126    <xsl:call-template name="datablockType"/>
127    <xsl:apply-templates select="./xsd:complexType/xsd:sequence/*" mode="category_element"/>
128  </xsl:template>
129
130  <!-- datablockType is special -->
131  <xsl:template name="datablockType">
132    <owl:Class rdf:ID="datablock">
133      <rdfs:label>datablock</rdfs:label>
134      <rdfs:comment>DATABLOCK class holds all categories of PDB data.</rdfs:comment>
135      <rdfs:subClassOf>
136        <owl:Class>
137          <owl:intersectionOf rdf:parseType="Collection">
138            <xsl:for-each select="/xsd:schema/xsd:complexType[@name='datablockType']/xsd:all/*">
139              <xsl:variable name="category"><xsl:value-of select="substring-before(@name,'Category')"/></xsl:variable>
140              <xsl:call-template name="hasCategory_restriction">
141                <xsl:with-param name="category" select="$category"/>
142              </xsl:call-template>
143            </xsl:for-each>
144          </owl:intersectionOf>
145        </owl:Class>
146      </rdfs:subClassOf>
147    </owl:Class>
148
149    <owl:DatatypeProperty rdf:ID="datablockName">
150      <rdfs:domain rdf:resource="#datablock"/>
151      <rdfs:range rdf:resource="&xsd;string"/>
152      <xsl:apply-templates select="./xsd:annotation"/>
153    </owl:DatatypeProperty>
154
155    <owl:InverseFunctionalProperty rdf:ID="hasCategoryElement">
156      <rdfs:comment>Abstract property for xxxCategory.</rdfs:comment>
157      <rdfs:domain rdf:resource="#datablock"/>
158      <rdfs:range rdf:resource="#CategoryElement"/>
159    </owl:InverseFunctionalProperty>
160  </xsl:template>
161
162  <xsl:template name="hasCategory_restriction">
163    <xsl:param name="category"/>
164    <xsl:variable name="categoryType" select="/xsd:schema/xsd:complexType[@name=concat($category,'Type')]/xsd:sequence/xsd:element"/>
165    <owl:Restriction>
166      <owl:onProperty rdf:resource="#{$category}Category"/>
167      <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger"><xsl:value-of select="$categoryType/@minOccurs"/></owl:minCardinality>
168    </owl:Restriction>
169    <xsl:if test="$categoryType/@maxOccurs != 'unbounded'">
170      <owl:Restriction>
171        <owl:onProperty rdf:resource="#{$category}Category"/>
172        <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger"><xsl:value-of select="$categoryType/@maxOccurs"/></owl:maxCardinality>
173      </owl:Restriction>
174    </xsl:if>
175  </xsl:template>
176
177  <!-- basic category types -->
178  <xsl:template match="xsd:element" mode="category_element">
179    <xsl:variable name="category"><xsl:value-of select="@name"/></xsl:variable>
180    <owl:Class rdf:ID="{@name}">
181      <rdfs:label><xsl:value-of select="@name"/></rdfs:label>
182      <xsl:apply-templates select="../../xsd:annotation"/>
183      <rdfs:subClassOf>
184        <owl:Class>
185          <owl:intersectionOf rdf:parseType="Collection">
186            <owl:Class rdf:about="#CategoryElement"/>
187            <xsl:for-each select="./xsd:complexType/xsd:all/*|./xsd:complexType/xsd:attribute">
188              <xsl:call-template name="category_item_restriction">
189                <xsl:with-param name="category" select="$category"/>
190              </xsl:call-template>
191            </xsl:for-each>
192          </owl:intersectionOf>
193        </owl:Class>
194      </rdfs:subClassOf>
195    </owl:Class>
196
197    <owl:InverseFunctionalProperty rdf:ID="{@name}Category">
198      <rdfs:label><xsl:value-of select="@name"/>Category</rdfs:label>
199      <rdfs:comment>
200        This property indicates that datablock
201        has a category element <xsl:value-of select="@name"/>.
202      </rdfs:comment>
203      <rdfs:subPropertyOf rdf:resource="#hasCategoryElement"/>
204      <rdfs:seeAlso rdf:resource="#{@name}"/>
205      <rdfs:range rdf:resource="#{@name}"/>
206    </owl:InverseFunctionalProperty>
207
208    <owl:DatatypeProperty rdf:ID="{@name}Item">
209      <rdfs:label><xsl:value-of select="@name"/>Item</rdfs:label>
210      <rdfs:comment>Abstract Datatype property for <xsl:value-of select="@name"/> items.</rdfs:comment>
211      <rdfs:subPropertyOf rdf:resource="#categoryItem"/>
212      <rdfs:domain rdf:resource="#{@name}"/>
213    </owl:DatatypeProperty>
214
215    <owl:ObjectProperty rdf:ID="reference_to_{@name}">
216      <rdfs:label>reference_to_<xsl:value-of select="@name"/></rdfs:label>
217      <rdfs:comment>cross-reference to <xsl:value-of select="@name"/></rdfs:comment>
218      <rdfs:subPropertyOf rdf:resource="#reference_to"/>
219      <rdfs:range rdf:resource="#{@name}"/>
220    </owl:ObjectProperty>
221
222    <xsl:for-each select="./xsd:complexType/xsd:all/*|./xsd:complexType/xsd:attribute">
223      <xsl:call-template name="category_item">
224        <xsl:with-param name="category" select="$category"/>
225      </xsl:call-template>
226    </xsl:for-each>
227  </xsl:template>
228
229  <xsl:template name="category_item_restriction">
230    <xsl:param name="category"/>
231    <xsl:choose>
232      <xsl:when test="@use='required'">
233        <owl:Restriction>
234          <owl:onProperty rdf:resource="#{$category}.{@name}"/>
235          <owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality>
236        </owl:Restriction>
237      </xsl:when>
238      <xsl:when test="@use='optional'">
239        <owl:Restriction>
240          <owl:onProperty rdf:resource="#{$category}.{@name}"/>
241          <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">0</owl:minCardinality>
242        </owl:Restriction>
243        <owl:Restriction>
244          <owl:onProperty rdf:resource="#{$category}.{@name}"/>
245          <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality>
246        </owl:Restriction>
247      </xsl:when>
248      <xsl:otherwise>
249        <owl:Restriction>
250          <owl:onProperty rdf:resource="#{$category}.{@name}"/>
251          <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger"><xsl:value-of select="@minOccurs"/></owl:minCardinality>
252        </owl:Restriction>
253        <owl:Restriction>
254          <owl:onProperty rdf:resource="#{$category}.{@name}"/>
255          <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger"><xsl:value-of select="@maxOccurs"/></owl:maxCardinality>
256        </owl:Restriction>
257      </xsl:otherwise>
258    </xsl:choose>
259  </xsl:template>
260
261  <xsl:template name="category_item">
262    <xsl:param name="category"/>
263    <xsl:choose>
264      <xsl:when test="count(.//xsd:enumeration) = 0">
265        <!-- basic types -->
266        <xsl:variable name="datatype1"><xsl:value-of select="substring-after(@type,':')"/></xsl:variable>
267        <xsl:variable name="datatype2"><xsl:value-of select="substring-after(.//@base[1],':')"/></xsl:variable>
268        <owl:DatatypeProperty rdf:ID="{$category}.{@name}">
269          <rdfs:subPropertyOf rdf:resource="#{$category}Item"/>
270          <rdfs:range rdf:resource="&xsd;{concat($datatype1,$datatype2)}"/>
271          <rdfs:label><xsl:value-of select="concat($category,'.',@name)"/></rdfs:label>
272          <xsl:apply-templates select="./xsd:annotation"/>
273        </owl:DatatypeProperty>
274      </xsl:when>
275      <xsl:otherwise>
276        <xsl:variable name="datatype"><xsl:value-of select="substring-after(.//@base[1],':')"/></xsl:variable>
277        <owl:DatatypeProperty rdf:ID="{$category}.{@name}">
278          <rdfs:subPropertyOf rdf:resource="#{$category}Item"/>
279          <rdfs:domain rdf:resource="#{$category}"/>
280          <rdfs:range>
281            <owl:DataRange>
282              <owl:oneOf>
283                <xsl:call-template name="enumeration">
284                  <xsl:with-param name="elm" select=".//xsd:enumeration[1]"/>
285                  <xsl:with-param name="t" select="$datatype"/>
286                </xsl:call-template>
287              </owl:oneOf>
288            </owl:DataRange>
289          </rdfs:range>
290          <xsl:apply-templates select="./xsd:annotation"/>
291        </owl:DatatypeProperty>
292      </xsl:otherwise>
293    </xsl:choose>
294  </xsl:template>
295
296  <xsl:template name="enumeration">
297    <xsl:param name="elm"/>
298    <xsl:param name="t"/>
299    <rdf:List>
300      <rdf:first rdf:datatype="&xsd;{$t}"><xsl:value-of select="$elm/@value"/></rdf:first>
301      <xsl:choose>
302        <xsl:when test="count($elm/following-sibling::node()) = 0">
303          <rdf:rest rdf:resource="&rdf;nil"/>
304        </xsl:when>
305        <xsl:otherwise>
306          <rdf:rest>
307            <xsl:call-template name="enumeration">
308              <xsl:with-param name="elm"
309                              select="$elm/following-sibling::node()[1]"/>
310              <xsl:with-param name="t" select="$t"/>
311            </xsl:call-template>
312          </rdf:rest>
313        </xsl:otherwise>
314      </xsl:choose>
315    </rdf:List>
316  </xsl:template>
317
318  <!-- annotation of categories and items -->
319  <xsl:template match="xsd:annotation">
320    <rdfs:comment>
321      <xsl:value-of select="./xsd:documentation"/>
322    </rdfs:comment>
323  </xsl:template>
324
325  <xsl:template match="text()|*|@*"/>
326  <xsl:template match="text()|*|@*" mode="annotation"/>
327
328</xsl:stylesheet>