| 18 | = Basic = |
| 19 | == Template signatures == |
| 20 | Example: !IsCustodianOf |
| 21 | || Order || Role name || Role type || |
| 22 | || 1 || Custodian || Adult person || |
| 23 | || 2 || Child || Person || |
| 24 | || 3 || Type || !CustodyRelation || |
| 25 | |
| 26 | Example: !ClassificationOfIndividual |
| 27 | || Order || Role name || Role type || |
| 28 | || 1 || Individual || !PossibleIndividual || |
| 29 | || 2 || Class || !ClassOfIndividual || |
| 30 | == Template axioms == |
| 31 | |
| 32 | For !IsCustodianOf an axiom could say, the ''Parent'' stands in a |
| 33 | parenthood relationship of type ''CustodyRelation'' to the ''Child''. |
| 34 | |
| 35 | For !ClassificationOfIndividual (in Part 7), the rule is as follows. |
| 36 | {{{ |
| 37 | ClassificationOfIndividual(x1, x2) <-> |
| 38 | PossibleIndividual(x1) & |
| 39 | ClassOfIndividual(x2) & |
| 40 | ClassificationTemplate(x1, x2) . |
| 41 | }}} |
| 42 | (We use Prover9 syntax to express the formula, so we can use it as-is |
| 43 | in that proof tool.) |
| 44 | |
| 45 | = Some reasons why we need templates = |
| 46 | - Simplify use of ISO 15926 representations |
| 47 | - Expressions in the language of ISO 15926-2 tend to be |
| 48 | verbose. The entity types are also hard to grasp. With templates, |
| 49 | the logical design work can be left to modelling experts. |
| 50 | - A uniform approach to knowledge capture |
| 51 | - Templates are always ''statement forms''. Any valid template |
| 52 | instance corresponds to a statement. |
| 53 | - Simplify use of n-ary predicates |
| 54 | - Due to its basis in standard Description Logic, OWL has only |
| 55 | unary and binary predicates |
| 56 | - Templates are a convenient way to introduce n-ary predicates, |
| 57 | without introducing too much semantic confusion (cf. W3C's |
| 58 | [http://www.w3.org/TR/swbp-n-aryRelations/#useCase3 Purchase] example, for which instances are purchases, not facts) |
| 59 | - Convenient exchange of representations |
| 60 | - Templates are comparable to SQL table definitions, but the most |
| 61 | interesting roles (columns) are typed using reference data |
| 62 | - Convenient data transfer |
| 63 | - It's easy to instantiate templates and move a payload |
| 64 | |
| 65 | All of the above are good, but not exactly revolutionary. Arguably, |
| 66 | the greatest advantage of templates is found in the interpretation of |
| 67 | template rules as logical axioms. |
| 68 | |
| 69 | - Basis in precise modelling |
| 70 | - Templates are expressed in a clearly defined limited first-order |
| 71 | logic, whose properties are well known |
| 72 | - Definitions can be tested for compliance with ISO 15926-2 |
| 73 | - This is much of today's topic |
| 74 | - Templates can be tested for mutual consistency |
| 75 | - Payloads of data can be tested for internal consistency |
| 76 | - Complex templates can be defined in terms of simpler templates |
| 77 | - Libraries of templates can be tested for internal consistency |
| 78 | - We can check that templates are well-defined in the sense of always |
| 79 | reducing to a unique expression in the basic, Part 2 language |
| 80 | |
| 81 | = Template Expander: Intro, and a minimal example = |
| 82 | The |
| 83 | [https://www.posccaesar.org/svn/pub/TemplateExpander/applet/template-expander.html Template Expander] is a tool for working with template design. It |
| 84 | was written in Java by [http://heim.ifi.uio.no/martingi/ Martin Giese]. Development was funded by DNV |
| 85 | IRM. |
| 86 | == Java library == |
| 87 | Using the Java library |
| 88 | ([https://www.posccaesar.org/svn/pub/TemplateExpander/cmdline/template-expander.jar template-expander.jar]), expansion of template |
| 89 | rules can be built into ISO 15926 applications. |
| 90 | |
| 91 | The code is available as free software, with a BSD-type |
| 92 | [https://www.posccaesar.org/svn/pub/TemplateExpander/LICENSE LICENSE]: |
| 93 | {{{ |
| 94 | Copyright (c) 2009, DNV Information Risk Management |
| 95 | All rights reserved. |
| 96 | |
| 97 | Redistribution and use in source and binary forms, with or without |
| 98 | modification, are permitted provided that the following conditions are met: |
| 99 | |
| 100 | * Redistributions of source code must retain the above copyright |
| 101 | notice, this list of conditions and the following disclaimer. |
| 102 | * Redistributions in binary form must reproduce the above copyright |
| 103 | notice, this list of conditions and the following disclaimer in the |
| 104 | documentation and/or other materials provided with the distribution. |
| 105 | * Neither the name of DNV Information Risk Management nor the names of its |
| 106 | contributors may be used to endorse or promote products derived from |
| 107 | this software without specific prior written permission. |
| 108 | |
| 109 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 110 | (etc etc) |
| 111 | }}} |
| 112 | == Java applet == |
| 113 | At |
| 114 | [https://www.posccaesar.org/svn/pub/TemplateExpander/applet/template-expander.html Template Expander], a Java applet has been provided with a heading, |
| 115 | an introduction, and IDS-ADI and DNV logos. |
| 116 | === Window "Template Definitions" === |
| 117 | Enter all template definitions into this window. |
| 118 | |
| 119 | Upon initialization, the templates defined in the |
| 120 | [https://www.posccaesar.org/svn/projects/ISO15926/Part7-Apr-2009_delivery/ISO15926-7_TS.pdf Part 7 April 2009 draft] |
| 121 | are loaded here, in Prover9 format. |
| 122 | |
| 123 | For a toy example, consider a two-place template "!SiblingOf(x, y)" for |
| 124 | expressing that people are siblings. Intuitively, "!SiblingOf(Alfred, |
| 125 | Betty)" should mean that Alfred and Betty are siblings. Template |
| 126 | signature: |
| 127 | || Order || Role name || Role type || |
| 128 | || 1 || Sibling A || Person || |
| 129 | || 2 || Sibling B || Person || |
| 130 | |
| 131 | Note that the signature doesn't say anything about how role-fillers |
| 132 | are related. For that, we assume our ontology (our reference data |
| 133 | library) defines a relation ''hasChild'', holding between parents and |
| 134 | their children. We use this in the template axiom. |
| 135 | |
| 136 | {{{ |
| 137 | SiblingOf(x, y) <-> |
| 138 | Person(x) & Person (y) & |
| 139 | exists z ( Person(z) & |
| 140 | hasChild(z, x) & |
| 141 | hasChild(z, y)) . |
| 142 | }}} |
| 143 | (Note the final ".", which is required by Prover9.) |
| 144 | |
| 145 | (for an ISO 15926 application using reference classes, we'd have in |
| 146 | line 2, e.g., |
| 147 | {{{ |
| 148 | ClassificationTemplate(x, Person) & ... |
| 149 | }}} |
| 150 | ) |
| 151 | === Window "Input Formula" === |
| 152 | This window is for entering atomic/ground statements using the |
| 153 | template language. |
| 154 | |
| 155 | Enter a single formula here (without a final "."). If you wish to test |
| 156 | more than one template instance, then express it as a conjunction, |
| 157 | with "&". |
| 158 | {{{ |
| 159 | SiblingOf(Alfred, Betty) |
| 160 | }}} |
| 161 | |
| 162 | We need to follow the restrictions on names of variables, individuals, |
| 163 | and so forth given by Prover9. |
| 164 | === Button "Expand" === |
| 165 | With our toy example, the ''Expand'' button returns this: |
| 166 | {{{ |
| 167 | Person(Alfred) |
| 168 | & Person(Betty) |
| 169 | & exists z (Person(z) & hasChild(z, Alfred) & hasChild(z, Betty)) |
| 170 | }}} |
| 171 | ==== Checkbox "Skolemize result" ==== |
| 172 | If we choose to ''skolemize'', new terms are created to satisfy the |
| 173 | ''exists'' quantifiers: |
| 174 | {{{ |
| 175 | Person(Alfred) |
| 176 | & Person(Betty) |
| 177 | & Person(cz0) |
| 178 | & hasChild(cz0, Alfred) |
| 179 | & hasChild(cz0, Betty) |
| 180 | }}} |
| 181 | This can be easily converted into XML or RDF, for inspection in |
| 182 | various tools; see below ([id:b2f8cdce-0346-430a-a576-cf9ba747f356 |
| 183 | ex. 1], [id:47904671-d234-4ffa-946b-c0934b49c5ad ex. 2]). Visualized |
| 184 | in [http://semweb.salzburgresearch.at/apps/rdf-gravity/ RDF-Gravity], |
| 185 | an RDF file can appear follows. |
| 186 | |
| 187 | [[Image(AlfredBetty-tpl-instances.png)]] |
| 188 | |
| 189 | = Prover9: Intro, and the minimal example again = |
| 190 | == The program == |
| 191 | The Prover9 theorem prover, and its companion Mace4 for finding |
| 192 | counterexamples, have a convenient graphical user interface that makes |
| 193 | it more usable than other provers that are available. |
| 194 | |
| 195 | NB. Prover9 works for full first-order logic. This is much more |
| 196 | permissive than what is allowed for templates -- we can make more |
| 197 | expressive statements. This means that application of Prover9 can be |
| 198 | used to test many kinds of relationships that can not be expressed in |
| 199 | templates themselves. |
| 200 | === Symbol list: Logical operators === |
| 201 | Prover9 is quite picky about symbols. |
| 202 | || Operator || Symbol || |
| 203 | || true || $T || |
| 204 | || false || $F || |
| 205 | || negation || - || |
| 206 | || disjunction || \mid || |
| 207 | || conjunction || & || |
| 208 | || implication || -> || |
| 209 | || equivalence || <-> || |
| 210 | || universal quantification || all || |
| 211 | || existential quantification || exists || |
| 212 | || equality || = || |
| 213 | || negated equality || != || |
| 214 | === Window "Assumptions" === |
| 215 | This is where the template axioms go. We can test for well-formedness. |
| 216 | Incidentally, this is also done in the Template Expander, so if you |
| 217 | get expansions there, your definitions should be good for Prover9 too. |
| 218 | |
| 219 | Let's enter in our example from above. |
| 220 | {{{ |
| 221 | SiblingOf(x, y) <-> |
| 222 | Person(x) & Person (y) & |
| 223 | exists z ( Person(z) & |
| 224 | hasChild(z, x) & |
| 225 | hasChild(z, y)) . |
| 226 | |
| 227 | SiblingOf(Alfred, Betty) . |
| 228 | }}} |
| 229 | We can click the ''Well Formed?'' button to check that we haven't made a |
| 230 | syntax error. |
| 231 | === Window "Goals" === |
| 232 | ==== Proof ==== |
| 233 | With the template definition and our instance, we can prove that Betty |
| 234 | is a sibling of Alfred -- since the order of conjuncts in the template |
| 235 | axiom is insignificant. We click the button ''Start'' under "Proof |
| 236 | Search". |
| 237 | {{{ |
| 238 | SiblingOf(Betty, Alfred) . |
| 239 | }}} |
| 240 | We can also show information about the role-fillers Alfred and Betty |
| 241 | that is implied by the template definition. |
| 242 | {{{ |
| 243 | Person(Betty) . |
| 244 | }}} |
| 245 | ==== Disproof ==== |
| 246 | There's also information that ''doesn't'' follow from our assumptions. |
| 247 | In many cases, Prover9 can explain that this is so by generating a |
| 248 | counterexample. For the following, click the button ''Start'' under |
| 249 | "Model/Counterexample Search". (The proof search should fail since we |
| 250 | haven't entered any assumption to the effect that Alfred has a child.) |
| 251 | {{{ |
| 252 | exists x ( hasChild (Alfred, x)) . |
| 253 | }}} |
| 254 | The converse is of course provable. |
| 255 | {{{ |
| 256 | exists x ( hasChild (x, Alfred)) . |
| 257 | }}} |
| 258 | = Rahul's examples = |
| 259 | == Properties of individuals. Preparation == |
| 260 | In email 2009-11-04, Rahul Patil (Bentley) proposes templates for |
| 261 | properties of individuals. He provides two alternatives -- "Option 1" |
| 262 | and "Option 2". |
| 263 | |
| 264 | To prepare the templates for testing in the Template Expander and |
| 265 | Prover9, we first edit the formulae to replace symbols "^" with "&", |
| 266 | and the mirror-image existential quantifier with "exists". |
| 267 | |
| 268 | == Option 1 == |
| 269 | === Prepare axiom === |
| 270 | The template axiom is the following. |
| 271 | {{{ |
| 272 | PropertyOfIndividual(x1, x2, x3) <-> |
| 273 | PossibleIndividual(x1) & |
| 274 | Property(x2) & |
| 275 | ClassOfIndirectProperty(x3) & |
| 276 | exists u ( IndirectPropertyTriple(u, x1, x2) & |
| 277 | ClassificationTemplate(u,x3)) |
| 278 | }}} |
| 279 | To check that the definition is syntactically adequate, we open the |
| 280 | Template Expander and add the definition to the end of the Template |
| 281 | Definitions field. |
| 282 | === Enter sample instance === |
| 283 | We then enter the example instance given by Rahul as an Input Formula. |
| 284 | |
| 285 | Note that the input needs to be slightly rewritten to conform to the |
| 286 | Prover9 requirements on permissible terms. We replace |
| 287 | {{{ |
| 288 | PropertyOfIndividual( #s-101, 60bar, Maximum Working Pressure ) |
| 289 | }}} |
| 290 | with |
| 291 | {{{ |
| 292 | PropertyOfIndividual(s101, bar60, MaximumWorkingPressure) |
| 293 | }}} |
| 294 | This is no major issue, since we're only testing content anyway. (For |
| 295 | a user application implementation, one would need to handle data type |
| 296 | values. This is a different story.) |
| 297 | === Expand === |
| 298 | To evaluate the input, press ''Expand''. The following result is |
| 299 | returned. |
| 300 | {{{ |
| 301 | PossibleIndividual(s101) |
| 302 | & Property(bar60) |
| 303 | & ClassOfIndirectProperty(MaximumWorkingPressure) |
| 304 | & exists u |
| 305 | ( (IndirectProperty(u) & hasPossessor(u, s101) & hasProperty(u, bar60)) |
| 306 | & exists z |
| 307 | ( Classification(z) |
| 308 | & hasClassified(z, u) |
| 309 | & hasClassifier(z, MaximumWorkingPressure))) |
| 310 | }}} |
| 311 | During the expansion, the templates IndirectPropertyTriple and |
| 312 | ClassificationTemplate, defined in Part 7, were expanded. The result |
| 313 | makes perfectly good sense as an ISO 15926-2 pattern. The fact that |
| 314 | the Expander applies the extension demonstrates that the syntactic |
| 315 | structure is sound. |
| 316 | |
| 317 | We can easily see that the expanded results makes no reference to |
| 318 | predicates not defined in ISO 15926-2. |
| 319 | === Triples view of example === |
| 320 | If we wish to look at the result in a "triples" format, we can check |
| 321 | the ''Skolemize result'' box before expansion. The result is as |
| 322 | follows. |
| 323 | ==== Prover9 format ==== |
| 324 | {{{ |
| 325 | PossibleIndividual(s101) |
| 326 | & Property(bar60) |
| 327 | & ClassOfIndirectProperty(MaximumWorkingPressure) |
| 328 | & (IndirectProperty(cu0) & hasPo.sessor(cu0, s101) & hasProperty(cu0, bar60)) |
| 329 | & Classification(cz0) |
| 330 | & hasClassified(cz0, cu0) |
| 331 | & hasClassifier(cz0, MaximumWorkingPressure) |
| 332 | }}} |
| 333 | With this, we have found a fully explicit expression, in terms of Part |
| 334 | 2 and individual terms, of the template statement. We have reduced a |
| 335 | compact template statement to statements in the Part 2 language -- the |
| 336 | basic language of ISO 15926. |
| 337 | ==== XML format ==== |
| 338 | A trivial search/replace macro can convert this into XML, for instance |
| 339 | as follows. |
| 340 | {{{ |
| 341 | <?xml version="1.0" encoding="UTF-8"?> |
| 342 | <expandedtemplates> |
| 343 | <node type="PossibleIndividual" name="s101"/> |
| 344 | <node type="Property" name="bar60"/> |
| 345 | <node type="ClassOfIndirectProperty" name="MaximumWorkingPressure"/> |
| 346 | <node type="IndirectProperty" name="cu0"/> |
| 347 | <edge type="hasPossessor" from="cu0" to="s101"/> |
| 348 | <edge type="hasProperty" from="cu0" to="bar60"/> |
| 349 | <node type="Classification" name="cz0"/> |
| 350 | <edge type="hasClassified" from="cz0" to="cu0"/> |
| 351 | <edge type="hasClassifier" from="cz0" to="MaximumWorkingPressure"/> |
| 352 | </expandedtemplates> |
| 353 | }}} |
| 354 | ==== RDF format ==== |
| 355 | The following is a custom-made RDF representation that can be useful |
| 356 | for visualization of the Part 2 structure of expanded template |
| 357 | instances. |
| 358 | {{{ |
| 359 | <?xml version="1.0" encoding="UTF-8"?> |
| 360 | <rdf:RDF xmlns="http://test.org/Data#" xmlns:rdl="test.org/Data#" |
| 361 | xmlns:owl="http://www.w3.org/2002/07/owl#" |
| 362 | xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" |
| 363 | xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> |
| 364 | <rdl:PossibleIndividual rdf:about="s101"/> |
| 365 | <rdl:Property rdf:about="bar60"/> |
| 366 | <rdl:ClassOfIndirectProperty rdf:about="MaximumWorkingPressure"/> |
| 367 | <rdl:IndirectProperty rdf:about="cu0"/> |
| 368 | <rdf:Description rdf:about="cu0"> |
| 369 | <rdl:hasPossessor rdf:resource="s101"/> |
| 370 | </rdf:Description> |
| 371 | <rdf:Description rdf:about="cu0"> |
| 372 | <rdl:hasProperty rdf:resource="bar60"/> |
| 373 | </rdf:Description> |
| 374 | <rdf:Description rdf:about="cu0"> |
| 375 | <rdf:type rdf:resource="MaximumWorkingPressure"/> |
| 376 | </rdf:Description> |
| 377 | </rdf:RDF> |
| 378 | }}} |
| 379 | Visualized in [http://semweb.salzburgresearch.at/apps/rdf-gravity/ RDF-Gravity], this RDF file appears as follows. |
| 380 | |
| 381 | [[Image(PropertyOfIndividual-tpl-instances.png)]] |
| 382 | == Option 2 == |
| 383 | === Prepare axiom === |
| 384 | The template axiom is the following. |
| 385 | {{{ |
| 386 | PropertyOfIndividual(x1, x2, x3, x4) <-> |
| 387 | PossibleIndividual(x1) & |
| 388 | ArithmeticNumber(x2) & |
| 389 | Scale (x3) & |
| 390 | ClassOfIndirectProperty (x4) & |
| 391 | exists y1 exists y2 (MagnitudeOfProperty(y1, x2, x3) & |
| 392 | IndirectPropertyTriple(y2, x1, y1) & |
| 393 | ClassificationTemplate(y2,x4)) |
| 394 | }}} |
| 395 | Notable corrections made vs. PDF version: |
| 396 | - The fourth argument (x4) was missing |
| 397 | - "ArithmeticNumber" was misspelt as "ArithmaticNumber". This kind of |
| 398 | mistake can be tricky to spot in larger cases. As far as the |
| 399 | Expander is concerned, this introduces a new primitive concept |
| 400 | named "ArithmaticNumber". |
| 401 | - "Эy1, y2" needs rewriting as "exists y1 exists y2". |
| 402 | - Remember to add a final dot "." (very confusing in practice!) |
| 403 | |
| 404 | We replace the Option 1 formula in the Template Definitions frame by |
| 405 | this one. |
| 406 | === Enter sample instance === |
| 407 | We need to enter the value "60" as an individual term that Prover9 can |
| 408 | accept. I have written "d60" here. |
| 409 | {{{ |
| 410 | PropertyOfIndividual(s101, d60, bar, MaximumWorkingPressure) |
| 411 | }}} |
| 412 | === Expand === |
| 413 | The following result is returned. |
| 414 | {{{ |
| 415 | PossibleIndividual(s101) |
| 416 | & ArithmeticNumber(d60) |
| 417 | & Scale(bar) |
| 418 | & ClassOfIndirectProperty(MaximumWorkingPressure) |
| 419 | & exists y1 |
| 420 | exists y2 |
| 421 | ( ( Property(y1) |
| 422 | & ArithmeticNumber(d60) |
| 423 | & Scale(bar) |
| 424 | & exists u |
| 425 | ( ( PropertyQuantification(u) |
| 426 | & hasInput(u, y1) |
| 427 | & hasResult(u, d60)) |
| 428 | & exists z |
| 429 | ( Classification(z) |
| 430 | & hasClassified(z, u) |
| 431 | & hasClassifier(z, bar)))) |
| 432 | & (IndirectProperty(y2) & hasPossessor(y2, s101) & hasProperty(y2, y1)) |
| 433 | & exists z |
| 434 | ( Classification(z) |
| 435 | & hasClassified(z, y2) |
| 436 | & hasClassifier(z, MaximumWorkingPressure))) |
| 437 | }}} |
| 438 | This template applies MagnitudeOfProperty, one of the "Initial Set" |
| 439 | templates of Part 7. Accordingly, the result is more complex. The |
| 440 | difference is that the quantification of the property is here |
| 441 | represented explicitly -- the property is explicitly stated to refer |
| 442 | by way of the ''bar'' scale to the value 60. |
| 443 | |
| 444 | Once again, the successful expansion indicates that the template |
| 445 | definition is sound. We can see by manual inspection that no reference |
| 446 | is made to predicates not defined in Part 2. (But for the latter, we |
| 447 | should really have a tool to make that check automatically. This |
| 448 | shouldn't be difficult to write.) |
| 449 | === Triples view of example === |
| 450 | ==== Prover9 format ==== |
| 451 | We select ''Skolemize result'' to produce the following. |
| 452 | {{{ |
| 453 | PossibleIndividual(s101) |
| 454 | & ArithmeticNumber(d60) |
| 455 | & Scale(bar) |
| 456 | & ClassOfIndirectProperty(MaximumWorkingPressure) |
| 457 | & ( Property(cy11) |
| 458 | & ArithmeticNumber(d60) |
| 459 | & Scale(bar) |
| 460 | & (PropertyQuantification(cu6) & hasInput(cu6, cy11) & hasResult(cu6, d60)) |
| 461 | & Classification(cz8) |
| 462 | & hasClassified(cz8, cu6) |
| 463 | & hasClassifier(cz8, bar)) |
| 464 | & (IndirectProperty(cy21) & hasPossessor(cy21, s101) & hasProperty(cy21, cy11)) |
| 465 | & Classification(cz9) |
| 466 | & hasClassified(cz9, cy21) |
| 467 | & hasClassifier(cz9, MaximumWorkingPressure) |
| 468 | }}} |
| 469 | ==== XML format ==== |
| 470 | Converted into XML, this can look as follows. |
| 471 | {{{ |
| 472 | <?xml version="1.0" encoding="UTF-8"?> |
| 473 | <expandedtemplates> |
| 474 | <node type="PossibleIndividual" name="s101"/> |
| 475 | <node type="ArithmeticNumber" name="d60"/> |
| 476 | <node type="Scale" name="bar"/> |
| 477 | <node type="ClassOfIndirectProperty" name="MaximumWorkingPressure"/> |
| 478 | <node type="Property" name="cy11"/> |
| 479 | <node type="ArithmeticNumber" name="d60"/> |
| 480 | <node type="Scale" name="bar"/> |
| 481 | <node type="PropertyQuantification" name="cu6"/> |
| 482 | <edge type="hasInput" from="cu6" to="cy11"/> |
| 483 | <edge type="hasResult" from="cu6" to="d60"/> |
| 484 | <node type="Classification" name="cz8"/> |
| 485 | <edge type="hasClassified" from="cz8" to="cu6"/> |
| 486 | <edge type="hasClassifier" from="cz8" to="bar"/> |
| 487 | <node type="IndirectProperty" name="cy21"/> |
| 488 | <edge type="hasPossessor" from="cy21" to="s101"/> |
| 489 | <edge type="hasProperty" from="cy21" to="cy11"/> |
| 490 | <node type="Classification" name="cz9"/> |
| 491 | <edge type="hasClassified" from="cz9" to="cy21"/> |
| 492 | <edge type="hasClassifier" from="cz9" to="MaximumWorkingPressure"/> |
| 493 | </expandedtemplates> |
| 494 | }}} |
| 495 | ==== RDF format ==== |
| 496 | The following is a custom-made RDF representation that can be useful |
| 497 | for visualization of the Part 2 structure of expanded template |
| 498 | instances. |
| 499 | {{{ |
| 500 | <?xml version="1.0" encoding="UTF-8"?> |
| 501 | <rdf:RDF xmlns="http://test.org/Data#" xmlns:rdl="test.org/Data#" |
| 502 | xmlns:owl="http://www.w3.org/2002/07/owl#" |
| 503 | xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" |
| 504 | xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> |
| 505 | <rdl:PossibleIndividual rdf:about="s101"/> |
| 506 | <rdl:ArithmeticNumber rdf:about="d60"/> |
| 507 | <rdl:Scale rdf:about="bar"/> |
| 508 | <rdl:ClassOfIndirectProperty rdf:about="MaximumWorkingPressure"/> |
| 509 | <rdl:Property rdf:about="cy11"/> |
| 510 | <rdl:ArithmeticNumber rdf:about="d60"/> |
| 511 | <rdl:Scale rdf:about="bar"/> |
| 512 | <rdl:PropertyQuantification rdf:about="cu6"/> |
| 513 | <rdl:IndirectProperty rdf:about="cy21"/> |
| 514 | <rdf:Description rdf:about="cu6"> |
| 515 | <rdl:hasInput rdf:resource="cy11"/> |
| 516 | </rdf:Description> |
| 517 | <rdf:Description rdf:about="cu6"> |
| 518 | <rdl:hasResult rdf:resource="d60"/> |
| 519 | </rdf:Description> |
| 520 | <rdf:Description rdf:about="cy21"> |
| 521 | <rdl:hasPossessor rdf:resource="s101"/> |
| 522 | </rdf:Description> |
| 523 | <rdf:Description rdf:about="cy21"> |
| 524 | <rdl:hasProperty rdf:resource="cy11"/> |
| 525 | </rdf:Description> |
| 526 | <rdf:Description rdf:about="cu6"> |
| 527 | <rdf:type rdf:resource="bar"/> |
| 528 | </rdf:Description> |
| 529 | <rdf:Description rdf:about="cy21"> |
| 530 | <rdf:type rdf:resource="MaximumWorkingPressure"/> |
| 531 | </rdf:Description> |
| 532 | </rdf:RDF> |
| 533 | }}} |
| 534 | Visualized in [http://semweb.salzburgresearch.at/apps/rdf-gravity/ RDF-Gravity], this RDF file appears as follows. |
| 535 | |
| 536 | [[Image(PropertyOfIndividual2-tpl-instances.png)]] |
| 537 | |