@skaterqiang/protege-js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +48 -0
  3. package/README.md +287 -0
  4. package/docs/API.md +654 -0
  5. package/docs/design/OWL2-/347/274/272/345/217/243/345/210/206/346/236/220.md +140 -0
  6. package/docs/owl2-rl/OWL2-RL-/350/247/204/345/210/231/347/273/206/345/210/231.md +168 -0
  7. package/docs/owl2-rl/owl2-profiles-spec-zh.html +1914 -0
  8. package/docs/owl2-rl/owl2-profiles-spec.html +1916 -0
  9. package/docs/owl2-rl/rl_rules.json +392 -0
  10. package/main.js +46 -0
  11. package/package.json +76 -0
  12. package/sample/README.md +74 -0
  13. package/sample/case1-ecommerce-risk.js +170 -0
  14. package/sample/case10-ecommerce-customer-service.js +454 -0
  15. package/sample/case2-family-swrl.js +147 -0
  16. package/sample/case3-pharma-safety.js +132 -0
  17. package/sample/case4-knowledge-publishing.js +111 -0
  18. package/sample/case5-obda-profiles.js +153 -0
  19. package/sample/case6-medical-ontology.js +152 -0
  20. package/sample/case7-manufacturing-ppr.js +155 -0
  21. package/sample/case8-real-medical-bfo-ogms.js +353 -0
  22. package/sample/case9-real-manufacturing-iao.js +360 -0
  23. package/sample/ontologies/bfo.owl +1715 -0
  24. package/sample/ontologies/iao.owl +8532 -0
  25. package/sample/ontologies/ogms.owl +4320 -0
  26. package/sample/ontologies/ro-core.owl +1010 -0
  27. package/scripts/verify-api.js +53 -0
  28. package/src/index.js +176 -0
  29. package/src/inference/OWL2ProfileReasoners.js +67 -0
  30. package/src/inference/OWL2RLReasoner.js +65 -0
  31. package/src/inference/ReasonerQueries.js +111 -0
  32. package/src/inference/SWRLReasoner.js +409 -0
  33. package/src/inference/TripleStore.js +82 -0
  34. package/src/inference/rdf.js +83 -0
  35. package/src/inference/rules/owl2el.js +33 -0
  36. package/src/inference/rules/owl2ql.js +29 -0
  37. package/src/inference/rules/owl2rl.js +823 -0
  38. package/src/io/FunctionalSyntaxParser.js +399 -0
  39. package/src/io/FunctionalSyntaxWriter.js +180 -0
  40. package/src/io/ManchesterSyntaxParser.js +398 -0
  41. package/src/io/OWLXMLParser.js +356 -0
  42. package/src/io/OntologyLoader.js +125 -0
  43. package/src/io/RDFGraphToOntology.js +702 -0
  44. package/src/io/RDFXMLParser.js +319 -0
  45. package/src/io/RDFXMLWriter.js +196 -0
  46. package/src/io/SWRLParser.js +150 -0
  47. package/src/io/TurtleParser.js +363 -0
  48. package/src/io/TurtleWriter.js +393 -0
  49. package/src/model/IRI.js +62 -0
  50. package/src/model/OWLAxiom.js +507 -0
  51. package/src/model/OWLClassExpression.js +242 -0
  52. package/src/model/OWLEntity.js +142 -0
  53. package/src/model/OWLLiteral.js +30 -0
  54. package/src/model/OWLModelManager.js +106 -0
  55. package/src/model/OWLOntology.js +119 -0
  56. package/src/model/SWRL.js +152 -0
  57. package/src/model/event/OWLModelManagerEvent.js +33 -0
  58. package/src/model/hierarchy/HierarchyProvider.js +214 -0
  59. package/src/profiles/OWL2Profiles.js +185 -0
  60. package/src/server/public/app.js +97 -0
  61. package/src/server/public/index.html +49 -0
  62. package/src/server/webServer.js +138 -0
  63. package/src/validation/GlobalRestrictionsValidator.js +172 -0
  64. package/test/core.test.js +111 -0
  65. package/test/exports-map.test.js +165 -0
  66. package/test/owl2/axioms.test.js +160 -0
  67. package/test/owl2/classExpressions.test.js +99 -0
  68. package/test/owl2/functional-syntax-writer.test.js +65 -0
  69. package/test/owl2/functional.test.js +113 -0
  70. package/test/owl2/global-restrictions.test.js +76 -0
  71. package/test/owl2/longtail.test.js +74 -0
  72. package/test/owl2/manchester-syntax.test.js +100 -0
  73. package/test/owl2/ontology-loader-imports.test.js +62 -0
  74. package/test/owl2/owlxml-parser.test.js +112 -0
  75. package/test/owl2/profile-reasoners.test.js +108 -0
  76. package/test/owl2/profiles.test.js +66 -0
  77. package/test/owl2/rdf-graph-to-ontology.test.js +177 -0
  78. package/test/owl2/rdfxml-punning.test.js +25 -0
  79. package/test/owl2/rdfxml-writer.test.js +55 -0
  80. package/test/owl2/rdfxml.test.js +91 -0
  81. package/test/owl2/reasoner-queries.test.js +58 -0
  82. package/test/owl2/sample-e2e.test.js +195 -0
  83. package/test/owl2/swrl-parser.test.js +60 -0
  84. package/test/owl2/swrl.test.js +131 -0
  85. package/test/owl2/turtle-writer.test.js +84 -0
  86. package/test/owl2/turtle.test.js +124 -0
  87. package/test/owl2rl/cax.test.js +57 -0
  88. package/test/owl2rl/cls.test.js +210 -0
  89. package/test/owl2rl/dt.test.js +72 -0
  90. package/test/owl2rl/eq.test.js +95 -0
  91. package/test/owl2rl/prp.test.js +198 -0
  92. package/test/owl2rl/scm.test.js +203 -0
@@ -0,0 +1,198 @@
1
+ 'use strict';
2
+
3
+ const { test } = require('node:test');
4
+ const assert = require('node:assert');
5
+ const { OWL2RLReasoner } = require('../../src/inference/OWL2RLReasoner');
6
+
7
+ const RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
8
+ const RDFS = 'http://www.w3.org/2000/01/rdf-schema#';
9
+ const OWL = 'http://www.w3.org/2002/07/owl#';
10
+ const T = RDF + 'type';
11
+ const SA = OWL + 'sameAs';
12
+
13
+ test('prp-ap: built-in annotation properties are typed', () => {
14
+ const r = new OWL2RLReasoner();
15
+ r.store.add('ex:a', 'ex:p', 'ex:b'); // seed
16
+ r.materialize();
17
+ assert.ok(r.entails(RDFS + 'label', T, OWL + 'AnnotationProperty'));
18
+ assert.ok(r.entails(RDFS + 'comment', T, OWL + 'AnnotationProperty'));
19
+ assert.ok(r.entails(OWL + 'versionInfo', T, OWL + 'AnnotationProperty'));
20
+ });
21
+
22
+ test('prp-dom: domain restriction types the subject', () => {
23
+ const r = new OWL2RLReasoner();
24
+ r.store.add('ex:p', RDFS + 'domain', 'ex:C');
25
+ r.store.add('ex:x', 'ex:p', 'ex:y');
26
+ r.materialize();
27
+ assert.ok(r.entails('ex:x', T, 'ex:C'));
28
+ });
29
+
30
+ test('prp-rng: range restriction types the object', () => {
31
+ const r = new OWL2RLReasoner();
32
+ r.store.add('ex:p', RDFS + 'range', 'ex:D');
33
+ r.store.add('ex:x', 'ex:p', 'ex:y');
34
+ r.materialize();
35
+ assert.ok(r.entails('ex:y', T, 'ex:D'));
36
+ });
37
+
38
+ test('prp-fp: functional property merges objects via sameAs', () => {
39
+ const r = new OWL2RLReasoner();
40
+ r.store.add('ex:p', T, OWL + 'FunctionalProperty');
41
+ r.store.add('ex:x', 'ex:p', 'ex:y1');
42
+ r.store.add('ex:x', 'ex:p', 'ex:y2');
43
+ r.materialize();
44
+ assert.ok(r.entails('ex:y1', SA, 'ex:y2'));
45
+ });
46
+
47
+ test('prp-ifp: inverse functional property merges subjects', () => {
48
+ const r = new OWL2RLReasoner();
49
+ r.store.add('ex:p', T, OWL + 'InverseFunctionalProperty');
50
+ r.store.add('ex:x1', 'ex:p', 'ex:y');
51
+ r.store.add('ex:x2', 'ex:p', 'ex:y');
52
+ r.materialize();
53
+ assert.ok(r.entails('ex:x1', SA, 'ex:x2'));
54
+ });
55
+
56
+ test('prp-irp: irreflexive property self-loop is inconsistent', () => {
57
+ const r = new OWL2RLReasoner();
58
+ r.store.add('ex:p', T, OWL + 'IrreflexiveProperty');
59
+ r.store.add('ex:x', 'ex:p', 'ex:x');
60
+ r.materialize();
61
+ assert.ok(r.inconsistencies.some(c => c.rule === 'prp-irp'));
62
+ });
63
+
64
+ test('prp-symp: symmetric property derives reverse edge', () => {
65
+ const r = new OWL2RLReasoner();
66
+ r.store.add('ex:p', T, OWL + 'SymmetricProperty');
67
+ r.store.add('ex:x', 'ex:p', 'ex:y');
68
+ r.materialize();
69
+ assert.ok(r.entails('ex:y', 'ex:p', 'ex:x'));
70
+ });
71
+
72
+ test('prp-asyp: asymmetric property with reverse edge is inconsistent', () => {
73
+ const r = new OWL2RLReasoner();
74
+ r.store.add('ex:p', T, OWL + 'AsymmetricProperty');
75
+ r.store.add('ex:x', 'ex:p', 'ex:y');
76
+ r.store.add('ex:y', 'ex:p', 'ex:x');
77
+ r.materialize();
78
+ assert.ok(r.inconsistencies.some(c => c.rule === 'prp-asyp'));
79
+ });
80
+
81
+ test('prp-trp: transitive property derives closure edge', () => {
82
+ const r = new OWL2RLReasoner();
83
+ r.store.add('ex:p', T, OWL + 'TransitiveProperty');
84
+ r.store.add('ex:a', 'ex:p', 'ex:b');
85
+ r.store.add('ex:b', 'ex:p', 'ex:c');
86
+ r.materialize();
87
+ assert.ok(r.entails('ex:a', 'ex:p', 'ex:c'));
88
+ });
89
+
90
+ test('prp-spo1: subproperty edges propagate to superproperty', () => {
91
+ const r = new OWL2RLReasoner();
92
+ r.store.add('ex:p', RDFS + 'subPropertyOf', 'ex:q');
93
+ r.store.add('ex:x', 'ex:p', 'ex:y');
94
+ r.materialize();
95
+ assert.ok(r.entails('ex:x', 'ex:q', 'ex:y'));
96
+ });
97
+
98
+ test('prp-spo2: property chain derives the composed edge', () => {
99
+ const r = new OWL2RLReasoner();
100
+ // chain (p1 p2) -> q
101
+ r.store.add('ex:q', OWL + 'propertyChainAxiom', '_:c1');
102
+ r.store.add('_:c1', RDF + 'first', 'ex:p1');
103
+ r.store.add('_:c1', RDF + 'rest', '_:c2');
104
+ r.store.add('_:c2', RDF + 'first', 'ex:p2');
105
+ r.store.add('_:c2', RDF + 'rest', RDF + 'nil');
106
+ r.store.add('ex:a', 'ex:p1', 'ex:b');
107
+ r.store.add('ex:b', 'ex:p2', 'ex:c');
108
+ r.materialize();
109
+ assert.ok(r.entails('ex:a', 'ex:q', 'ex:c'));
110
+ });
111
+
112
+ test('prp-eqp1: equivalent property forward direction', () => {
113
+ const r = new OWL2RLReasoner();
114
+ r.store.add('ex:p', OWL + 'equivalentProperty', 'ex:q');
115
+ r.store.add('ex:x', 'ex:p', 'ex:y');
116
+ r.materialize();
117
+ assert.ok(r.entails('ex:x', 'ex:q', 'ex:y'));
118
+ });
119
+
120
+ test('prp-eqp2: equivalent property backward direction', () => {
121
+ const r = new OWL2RLReasoner();
122
+ r.store.add('ex:p', OWL + 'equivalentProperty', 'ex:q');
123
+ r.store.add('ex:x', 'ex:q', 'ex:y');
124
+ r.materialize();
125
+ assert.ok(r.entails('ex:x', 'ex:p', 'ex:y'));
126
+ });
127
+
128
+ test('prp-pdw: property-disjoint violation is inconsistent', () => {
129
+ const r = new OWL2RLReasoner();
130
+ r.store.add('ex:p', OWL + 'propertyDisjointWith', 'ex:q');
131
+ r.store.add('ex:x', 'ex:p', 'ex:y');
132
+ r.store.add('ex:x', 'ex:q', 'ex:y');
133
+ r.materialize();
134
+ assert.ok(r.inconsistencies.some(c => c.rule === 'prp-pdw'));
135
+ });
136
+
137
+ test('prp-adp: AllDisjointProperties violation is inconsistent', () => {
138
+ const r = new OWL2RLReasoner();
139
+ r.store.add('ex:ad', T, OWL + 'AllDisjointProperties');
140
+ r.store.add('ex:ad', OWL + 'members', '_:m1');
141
+ r.store.add('_:m1', RDF + 'first', 'ex:p');
142
+ r.store.add('_:m1', RDF + 'rest', '_:m2');
143
+ r.store.add('_:m2', RDF + 'first', 'ex:q');
144
+ r.store.add('_:m2', RDF + 'rest', RDF + 'nil');
145
+ r.store.add('ex:x', 'ex:p', 'ex:y');
146
+ r.store.add('ex:x', 'ex:q', 'ex:y');
147
+ r.materialize();
148
+ assert.ok(r.inconsistencies.some(c => c.rule === 'prp-adp'));
149
+ });
150
+
151
+ test('prp-inv1: inverse property forward direction', () => {
152
+ const r = new OWL2RLReasoner();
153
+ r.store.add('ex:p', OWL + 'inverseOf', 'ex:q');
154
+ r.store.add('ex:x', 'ex:p', 'ex:y');
155
+ r.materialize();
156
+ assert.ok(r.entails('ex:y', 'ex:q', 'ex:x'));
157
+ });
158
+
159
+ test('prp-inv2: inverse property backward direction', () => {
160
+ const r = new OWL2RLReasoner();
161
+ r.store.add('ex:p', OWL + 'inverseOf', 'ex:q');
162
+ r.store.add('ex:x', 'ex:q', 'ex:y');
163
+ r.materialize();
164
+ assert.ok(r.entails('ex:y', 'ex:p', 'ex:x'));
165
+ });
166
+
167
+ test('prp-key: hasKey merges matching subjects via sameAs', () => {
168
+ const r = new OWL2RLReasoner();
169
+ r.store.add('ex:Person', OWL + 'hasKey', '_:k1');
170
+ r.store.add('_:k1', RDF + 'first', 'ex:ssn');
171
+ r.store.add('_:k1', RDF + 'rest', RDF + 'nil');
172
+ r.store.add('ex:a', T, 'ex:Person');
173
+ r.store.add('ex:b', T, 'ex:Person');
174
+ r.store.add('ex:a', 'ex:ssn', 'ex:s1');
175
+ r.store.add('ex:b', 'ex:ssn', 'ex:s1');
176
+ r.materialize();
177
+ assert.ok(r.entails('ex:a', SA, 'ex:b'));
178
+ });
179
+
180
+ test('prp-npa1: negative property assertion violation is inconsistent', () => {
181
+ const r = new OWL2RLReasoner();
182
+ r.store.add('ex:na', OWL + 'sourceIndividual', 'ex:i1');
183
+ r.store.add('ex:na', OWL + 'assertionProperty', 'ex:p');
184
+ r.store.add('ex:na', OWL + 'targetIndividual', 'ex:i2');
185
+ r.store.add('ex:i1', 'ex:p', 'ex:i2');
186
+ r.materialize();
187
+ assert.ok(r.inconsistencies.some(c => c.rule === 'prp-npa1'));
188
+ });
189
+
190
+ test('prp-npa2: negative data assertion violation is inconsistent', () => {
191
+ const r = new OWL2RLReasoner();
192
+ r.store.add('ex:na', OWL + 'sourceIndividual', 'ex:i');
193
+ r.store.add('ex:na', OWL + 'assertionProperty', 'ex:p');
194
+ r.store.add('ex:na', OWL + 'targetValue', '"v"^^<http://www.w3.org/2001/XMLSchema#string>');
195
+ r.store.add('ex:i', 'ex:p', '"v"^^<http://www.w3.org/2001/XMLSchema#string>');
196
+ r.materialize();
197
+ assert.ok(r.inconsistencies.some(c => c.rule === 'prp-npa2'));
198
+ });
@@ -0,0 +1,203 @@
1
+ 'use strict';
2
+
3
+ const { test } = require('node:test');
4
+ const assert = require('node:assert');
5
+ const { OWL2RLReasoner } = require('../../src/inference/OWL2RLReasoner');
6
+
7
+ const RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
8
+ const RDFS = 'http://www.w3.org/2000/01/rdf-schema#';
9
+ const OWL = 'http://www.w3.org/2002/07/owl#';
10
+ const T = RDF + 'type';
11
+ const SC = RDFS + 'subClassOf';
12
+ const SP = RDFS + 'subPropertyOf';
13
+ const EC = OWL + 'equivalentClass';
14
+ const EP = OWL + 'equivalentProperty';
15
+
16
+ test('scm-cls: class is subclass of itself and of owl:Thing; Nothing subclass of it', () => {
17
+ const r = new OWL2RLReasoner();
18
+ r.store.add('ex:C', T, OWL + 'Class');
19
+ r.materialize();
20
+ assert.ok(r.entails('ex:C', SC, 'ex:C'));
21
+ assert.ok(r.entails('ex:C', EC, 'ex:C'));
22
+ assert.ok(r.entails('ex:C', SC, OWL + 'Thing'));
23
+ assert.ok(r.entails(OWL + 'Nothing', SC, 'ex:C'));
24
+ });
25
+
26
+ test('scm-sco: subClassOf is transitive', () => {
27
+ const r = new OWL2RLReasoner();
28
+ r.store.add('ex:A', SC, 'ex:B');
29
+ r.store.add('ex:B', SC, 'ex:C');
30
+ r.materialize();
31
+ assert.ok(r.entails('ex:A', SC, 'ex:C'));
32
+ });
33
+
34
+ test('scm-eqc1: equivalentClass yields subClassOf both ways', () => {
35
+ const r = new OWL2RLReasoner();
36
+ r.store.add('ex:A', EC, 'ex:B');
37
+ r.materialize();
38
+ assert.ok(r.entails('ex:A', SC, 'ex:B'));
39
+ assert.ok(r.entails('ex:B', SC, 'ex:A'));
40
+ });
41
+
42
+ test('scm-eqc2: mutual subClassOf yields equivalentClass', () => {
43
+ const r = new OWL2RLReasoner();
44
+ r.store.add('ex:A', SC, 'ex:B');
45
+ r.store.add('ex:B', SC, 'ex:A');
46
+ r.materialize();
47
+ assert.ok(r.entails('ex:A', EC, 'ex:B'));
48
+ });
49
+
50
+ test('scm-op: object property is sub/equivalent property of itself', () => {
51
+ const r = new OWL2RLReasoner();
52
+ r.store.add('ex:p', T, OWL + 'ObjectProperty');
53
+ r.materialize();
54
+ assert.ok(r.entails('ex:p', SP, 'ex:p'));
55
+ assert.ok(r.entails('ex:p', EP, 'ex:p'));
56
+ });
57
+
58
+ test('scm-dp: datatype property is sub/equivalent property of itself', () => {
59
+ const r = new OWL2RLReasoner();
60
+ r.store.add('ex:p', T, OWL + 'DatatypeProperty');
61
+ r.materialize();
62
+ assert.ok(r.entails('ex:p', SP, 'ex:p'));
63
+ assert.ok(r.entails('ex:p', EP, 'ex:p'));
64
+ });
65
+
66
+ test('scm-spo: subPropertyOf is transitive', () => {
67
+ const r = new OWL2RLReasoner();
68
+ r.store.add('ex:p1', SP, 'ex:p2');
69
+ r.store.add('ex:p2', SP, 'ex:p3');
70
+ r.materialize();
71
+ assert.ok(r.entails('ex:p1', SP, 'ex:p3'));
72
+ });
73
+
74
+ test('scm-eqp1: equivalentProperty yields subPropertyOf both ways', () => {
75
+ const r = new OWL2RLReasoner();
76
+ r.store.add('ex:p', EP, 'ex:q');
77
+ r.materialize();
78
+ assert.ok(r.entails('ex:p', SP, 'ex:q'));
79
+ assert.ok(r.entails('ex:q', SP, 'ex:p'));
80
+ });
81
+
82
+ test('scm-eqp2: mutual subPropertyOf yields equivalentProperty', () => {
83
+ const r = new OWL2RLReasoner();
84
+ r.store.add('ex:p', SP, 'ex:q');
85
+ r.store.add('ex:q', SP, 'ex:p');
86
+ r.materialize();
87
+ assert.ok(r.entails('ex:p', EP, 'ex:q'));
88
+ });
89
+
90
+ test('scm-dom1: domain widens along subClassOf', () => {
91
+ const r = new OWL2RLReasoner();
92
+ r.store.add('ex:p', RDFS + 'domain', 'ex:A');
93
+ r.store.add('ex:A', SC, 'ex:B');
94
+ r.materialize();
95
+ assert.ok(r.entails('ex:p', RDFS + 'domain', 'ex:B'));
96
+ });
97
+
98
+ test('scm-dom2: domain narrows to subproperty', () => {
99
+ const r = new OWL2RLReasoner();
100
+ r.store.add('ex:p2', RDFS + 'domain', 'ex:C');
101
+ r.store.add('ex:p1', SP, 'ex:p2');
102
+ r.materialize();
103
+ assert.ok(r.entails('ex:p1', RDFS + 'domain', 'ex:C'));
104
+ });
105
+
106
+ test('scm-rng1: range widens along subClassOf', () => {
107
+ const r = new OWL2RLReasoner();
108
+ r.store.add('ex:p', RDFS + 'range', 'ex:A');
109
+ r.store.add('ex:A', SC, 'ex:B');
110
+ r.materialize();
111
+ assert.ok(r.entails('ex:p', RDFS + 'range', 'ex:B'));
112
+ });
113
+
114
+ test('scm-rng2: range narrows to subproperty', () => {
115
+ const r = new OWL2RLReasoner();
116
+ r.store.add('ex:p2', RDFS + 'range', 'ex:C');
117
+ r.store.add('ex:p1', SP, 'ex:p2');
118
+ r.materialize();
119
+ assert.ok(r.entails('ex:p1', RDFS + 'range', 'ex:C'));
120
+ });
121
+
122
+ test('scm-hv: hasValue restriction subsumption via subPropertyOf', () => {
123
+ const r = new OWL2RLReasoner();
124
+ // c1: p1 hasValue i ; c2: p2 hasValue i ; p1 subPropertyOf p2 => c1 subClassOf c2
125
+ r.store.add('ex:c1', OWL + 'hasValue', 'ex:i');
126
+ r.store.add('ex:c1', OWL + 'onProperty', 'ex:p1');
127
+ r.store.add('ex:c2', OWL + 'hasValue', 'ex:i');
128
+ r.store.add('ex:c2', OWL + 'onProperty', 'ex:p2');
129
+ r.store.add('ex:p1', SP, 'ex:p2');
130
+ r.materialize();
131
+ assert.ok(r.entails('ex:c1', SC, 'ex:c2'));
132
+ });
133
+
134
+ test('scm-svf1: someValuesFrom subsumption via filler subClassOf', () => {
135
+ const r = new OWL2RLReasoner();
136
+ r.store.add('ex:c1', OWL + 'someValuesFrom', 'ex:y1');
137
+ r.store.add('ex:c1', OWL + 'onProperty', 'ex:p');
138
+ r.store.add('ex:c2', OWL + 'someValuesFrom', 'ex:y2');
139
+ r.store.add('ex:c2', OWL + 'onProperty', 'ex:p');
140
+ r.store.add('ex:y1', SC, 'ex:y2');
141
+ r.materialize();
142
+ assert.ok(r.entails('ex:c1', SC, 'ex:c2'));
143
+ });
144
+
145
+ test('scm-svf2: someValuesFrom subsumption via subPropertyOf', () => {
146
+ const r = new OWL2RLReasoner();
147
+ r.store.add('ex:c1', OWL + 'someValuesFrom', 'ex:y');
148
+ r.store.add('ex:c1', OWL + 'onProperty', 'ex:p1');
149
+ r.store.add('ex:c2', OWL + 'someValuesFrom', 'ex:y');
150
+ r.store.add('ex:c2', OWL + 'onProperty', 'ex:p2');
151
+ r.store.add('ex:p1', SP, 'ex:p2');
152
+ r.materialize();
153
+ assert.ok(r.entails('ex:c1', SC, 'ex:c2'));
154
+ });
155
+
156
+ test('scm-avf1: allValuesFrom subsumption via filler subClassOf', () => {
157
+ const r = new OWL2RLReasoner();
158
+ r.store.add('ex:c1', OWL + 'allValuesFrom', 'ex:y1');
159
+ r.store.add('ex:c1', OWL + 'onProperty', 'ex:p');
160
+ r.store.add('ex:c2', OWL + 'allValuesFrom', 'ex:y2');
161
+ r.store.add('ex:c2', OWL + 'onProperty', 'ex:p');
162
+ r.store.add('ex:y1', SC, 'ex:y2');
163
+ r.materialize();
164
+ assert.ok(r.entails('ex:c1', SC, 'ex:c2'));
165
+ });
166
+
167
+ test('scm-avf2: allValuesFrom subsumption via subPropertyOf (reversed)', () => {
168
+ const r = new OWL2RLReasoner();
169
+ // T(c1, owl:allValuesFrom, y), T(c1, owl:onProperty, p1),
170
+ // T(c2, owl:allValuesFrom, y), T(c2, owl:onProperty, p2), T(p1, rdfs:subPropertyOf, p2)
171
+ // => T(c2, rdfs:subClassOf, c1)
172
+ r.store.add('ex:c1', OWL + 'allValuesFrom', 'ex:y');
173
+ r.store.add('ex:c1', OWL + 'onProperty', 'ex:p1');
174
+ r.store.add('ex:c2', OWL + 'allValuesFrom', 'ex:y');
175
+ r.store.add('ex:c2', OWL + 'onProperty', 'ex:p2');
176
+ r.store.add('ex:p1', SP, 'ex:p2');
177
+ r.materialize();
178
+ assert.ok(r.entails('ex:c2', SC, 'ex:c1'));
179
+ });
180
+
181
+ test('scm-int: intersection is subclass of each operand', () => {
182
+ const r = new OWL2RLReasoner();
183
+ r.store.add('ex:C', OWL + 'intersectionOf', '_:i1');
184
+ r.store.add('_:i1', RDF + 'first', 'ex:A');
185
+ r.store.add('_:i1', RDF + 'rest', '_:i2');
186
+ r.store.add('_:i2', RDF + 'first', 'ex:B');
187
+ r.store.add('_:i2', RDF + 'rest', RDF + 'nil');
188
+ r.materialize();
189
+ assert.ok(r.entails('ex:C', SC, 'ex:A'));
190
+ assert.ok(r.entails('ex:C', SC, 'ex:B'));
191
+ });
192
+
193
+ test('scm-uni: each union operand is subclass of the union', () => {
194
+ const r = new OWL2RLReasoner();
195
+ r.store.add('ex:C', OWL + 'unionOf', '_:u1');
196
+ r.store.add('_:u1', RDF + 'first', 'ex:A');
197
+ r.store.add('_:u1', RDF + 'rest', '_:u2');
198
+ r.store.add('_:u2', RDF + 'first', 'ex:B');
199
+ r.store.add('_:u2', RDF + 'rest', RDF + 'nil');
200
+ r.materialize();
201
+ assert.ok(r.entails('ex:A', SC, 'ex:C'));
202
+ assert.ok(r.entails('ex:B', SC, 'ex:C'));
203
+ });