openphar 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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/README.adoc +221 -0
  3. data/lib/openphar/cli/main.rb +137 -0
  4. data/lib/openphar/cli.rb +11 -0
  5. data/lib/openphar/core/slug_generator.rb +107 -0
  6. data/lib/openphar/core.rb +11 -0
  7. data/lib/openphar/errors/configuration_error.rb +8 -0
  8. data/lib/openphar/errors/monograph_not_found_error.rb +15 -0
  9. data/lib/openphar/errors/parse_error.rb +18 -0
  10. data/lib/openphar/errors/unknown_format_error.rb +8 -0
  11. data/lib/openphar/errors/unknown_publisher_error.rb +8 -0
  12. data/lib/openphar/errors/unknown_type_error.rb +8 -0
  13. data/lib/openphar/errors/validation_error.rb +15 -0
  14. data/lib/openphar/errors.rb +17 -0
  15. data/lib/openphar/exporters/coverage_validator.rb +265 -0
  16. data/lib/openphar/exporters/neo4j/model_registry.rb +130 -0
  17. data/lib/openphar/exporters/neo4j/node_builder.rb +84 -0
  18. data/lib/openphar/exporters/neo4j/property_mapper.rb +154 -0
  19. data/lib/openphar/exporters/neo4j/relationship_builder.rb +87 -0
  20. data/lib/openphar/exporters/neo4j.rb +16 -0
  21. data/lib/openphar/exporters/neo4j_exporter.rb +199 -0
  22. data/lib/openphar/exporters.rb +15 -0
  23. data/lib/openphar/linkers/chp/cross_edition_linker.rb +101 -0
  24. data/lib/openphar/linkers/chp.rb +11 -0
  25. data/lib/openphar/linkers/cross_publisher_linker.rb +295 -0
  26. data/lib/openphar/linkers/herbapedia_linker.rb +125 -0
  27. data/lib/openphar/linkers.rb +13 -0
  28. data/lib/openphar/migrators/chp/classifier.rb +86 -0
  29. data/lib/openphar/migrators/chp.rb +15 -0
  30. data/lib/openphar/migrators/chp_migrator.rb +130 -0
  31. data/lib/openphar/migrators/jp_migrator.rb +345 -0
  32. data/lib/openphar/migrators/phint_migrator.rb +426 -0
  33. data/lib/openphar/migrators.rb +15 -0
  34. data/lib/openphar/models/ahp.rb +25 -0
  35. data/lib/openphar/models/amino_acid_monograph.rb +28 -0
  36. data/lib/openphar/models/api.rb +29 -0
  37. data/lib/openphar/models/assay_specification.rb +19 -0
  38. data/lib/openphar/models/base_entity.rb +221 -0
  39. data/lib/openphar/models/biological_substance_monograph.rb +31 -0
  40. data/lib/openphar/models/chemical_drug_monograph.rb +39 -0
  41. data/lib/openphar/models/chp/biologic.rb +28 -0
  42. data/lib/openphar/models/chp/chemical_preparation.rb +28 -0
  43. data/lib/openphar/models/chp/chemical_substance.rb +28 -0
  44. data/lib/openphar/models/chp/general_chapter.rb +30 -0
  45. data/lib/openphar/models/chp/monograph.rb +116 -0
  46. data/lib/openphar/models/chp/section.rb +37 -0
  47. data/lib/openphar/models/chp/tcm_crude_drug.rb +28 -0
  48. data/lib/openphar/models/chp/tcm_extract.rb +29 -0
  49. data/lib/openphar/models/chp/tcm_formulation.rb +28 -0
  50. data/lib/openphar/models/chp.rb +33 -0
  51. data/lib/openphar/models/crude_drug_monograph.rb +31 -0
  52. data/lib/openphar/models/edition.rb +41 -0
  53. data/lib/openphar/models/formulation_monograph.rb +31 -0
  54. data/lib/openphar/models/hkcmms.rb +26 -0
  55. data/lib/openphar/models/identification_specification.rb +19 -0
  56. data/lib/openphar/models/jp/kampo_formula.rb +94 -0
  57. data/lib/openphar/models/jp.rb +21 -0
  58. data/lib/openphar/models/limit.rb +54 -0
  59. data/lib/openphar/models/mineral_substance_monograph.rb +28 -0
  60. data/lib/openphar/models/monograph.rb +58 -0
  61. data/lib/openphar/models/ph_int/buffer_solution.rb +38 -0
  62. data/lib/openphar/models/ph_int/dosage_form_monograph.rb +43 -0
  63. data/lib/openphar/models/ph_int/radiopharmaceutical_monograph.rb +52 -0
  64. data/lib/openphar/models/ph_int/reagent.rb +50 -0
  65. data/lib/openphar/models/ph_int/reference_substance.rb +50 -0
  66. data/lib/openphar/models/ph_int/test_method.rb +50 -0
  67. data/lib/openphar/models/ph_int/test_solution.rb +39 -0
  68. data/lib/openphar/models/ph_int/volumetric_solution.rb +38 -0
  69. data/lib/openphar/models/ph_int.rb +37 -0
  70. data/lib/openphar/models/physical_specification.rb +17 -0
  71. data/lib/openphar/models/publisher.rb +98 -0
  72. data/lib/openphar/models/purity_specification.rb +16 -0
  73. data/lib/openphar/models/supplement.rb +31 -0
  74. data/lib/openphar/models/test_specification.rb +29 -0
  75. data/lib/openphar/models/thp.rb +24 -0
  76. data/lib/openphar/models/vitamin_monograph.rb +28 -0
  77. data/lib/openphar/models.rb +58 -0
  78. data/lib/openphar/monograph_merger.rb +374 -0
  79. data/lib/openphar/parsers/base_monograph_parser.rb +108 -0
  80. data/lib/openphar/parsers/jp_html_parser.rb +92 -0
  81. data/lib/openphar/parsers/jp_html_parser_base.rb +113 -0
  82. data/lib/openphar/parsers/jp_ja_html_parser.rb +220 -0
  83. data/lib/openphar/parsers/phint_json_parser.rb +332 -0
  84. data/lib/openphar/parsers.rb +21 -0
  85. data/lib/openphar/registry/publisher_registry.rb +46 -0
  86. data/lib/openphar/registry/type_registry.rb +147 -0
  87. data/lib/openphar/registry.rb +24 -0
  88. data/lib/openphar/repositories/monograph_repository.rb +350 -0
  89. data/lib/openphar/repositories.rb +11 -0
  90. data/lib/openphar/transformers/jsonld_transformer.rb +106 -0
  91. data/lib/openphar/transformers.rb +11 -0
  92. data/lib/openphar/version.rb +5 -0
  93. data/lib/openphar.rb +119 -0
  94. data/ontology/bibliographic/edition.ttl +267 -0
  95. data/ontology/context/chp.jsonld +69 -0
  96. data/ontology/context/crude-drugs.jsonld +56 -0
  97. data/ontology/context/pharmacopoeia.jsonld +631 -0
  98. data/ontology/core/identification.ttl +456 -0
  99. data/ontology/core/pharmacopoeia.ttl +3427 -0
  100. data/ontology/core/substance-form.ttl +302 -0
  101. data/ontology/core/unit.ttl +493 -0
  102. data/ontology/publisher/chp/extensions.ttl +186 -0
  103. data/ontology/publisher/phint/extensions.ttl +327 -0
  104. data/ontology/quality/test-method.ttl +610 -0
  105. data/shapes/chp/monograph.ttl +153 -0
  106. data/shapes/edition-shapes.ttl +230 -0
  107. data/shapes/monograph-shapes.ttl +1324 -0
  108. metadata +319 -0
@@ -0,0 +1,302 @@
1
+ # Open Pharmacopoeia - Substance Form Ontology
2
+ #
3
+ # This module defines classes and properties for representing different
4
+ # forms of pharmaceutical substances (anhydrous, hydrate, solvate variants)
5
+ # and their equivalences.
6
+ #
7
+ # This addresses a key gap identified in the International Pharmacopoeia
8
+ # where substances like Paracetamol may exist in anhydrous or hydrate forms,
9
+ # each with different molecular weights and assay calculations.
10
+ #
11
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
12
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
13
+ @prefix owl: <http://www.w3.org/2002/07/owl#> .
14
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
15
+ @prefix skos: <http://www.w3.org/2004/02/skos/core#> .
16
+ @prefix dct: <http://purl.org/dc/terms/> .
17
+ @prefix op: <https://www.openphar.org/ontology/core/> .
18
+ @prefix sf: <https://www.openphar.org/ontology/substance-form/> .
19
+
20
+ <https://www.openphar.org/ontology/substance-form/>
21
+ a owl:Ontology ;
22
+ rdfs:label "Open Pharmacopoeia Substance Form Ontology"@en ;
23
+ rdfs:comment """
24
+ Ontology for representing different forms of pharmaceutical substances
25
+ including anhydrous, hydrate, and solvate variants. This enables
26
+ proper handling of molecular weight differences and assay calculations
27
+ for different substance forms.
28
+ """@en ;
29
+ owl:imports <https://www.openphar.org/ontology/core/> ;
30
+ dct:created "2026-02-26"^^xsd:date ;
31
+ dct:modified "2026-02-26"^^xsd:date .
32
+
33
+ # =============================================================================
34
+ # SUBSTANCE FORM CLASS
35
+ # =============================================================================
36
+
37
+ sf:SubstanceForm
38
+ a owl:Class ;
39
+ rdfs:label "Substance Form"@en ;
40
+ rdfs:comment """
41
+ A specific physical or chemical form of a pharmaceutical substance.
42
+ Different forms (anhydrous, hydrate, solvate) may have different
43
+ molecular weights and require different assay calculations.
44
+ """@en ;
45
+ rdfs:subClassOf [
46
+ a owl:Restriction ;
47
+ owl:onProperty sf:formOf ;
48
+ owl:cardinality 1
49
+ ] .
50
+
51
+ sf:formOf
52
+ a owl:ObjectProperty ;
53
+ rdfs:label "form of"@en ;
54
+ rdfs:comment "The base substance that this is a form of."@en ;
55
+ rdfs:domain sf:SubstanceForm ;
56
+ rdfs:range op:PharmacopoeiaMonograph .
57
+
58
+ sf:formType
59
+ a owl:ObjectProperty ;
60
+ rdfs:label "form type"@en ;
61
+ rdfs:comment "The type of form (anhydrous, hydrate, solvate)."@en ;
62
+ rdfs:domain sf:SubstanceForm ;
63
+ rdfs:range sf:FormType .
64
+
65
+ sf:molecularWeight
66
+ a owl:DatatypeProperty ;
67
+ rdfs:label "molecular weight"@en ;
68
+ rdfs:comment "The molecular weight of this specific form."@en ;
69
+ rdfs:domain sf:SubstanceForm ;
70
+ rdfs:range xsd:decimal .
71
+
72
+ sf:molecularFormula
73
+ a owl:DatatypeProperty ;
74
+ rdfs:label "molecular formula"@en ;
75
+ rdfs:comment "The molecular formula of this specific form."@en ;
76
+ rdfs:domain sf:SubstanceForm ;
77
+ rdfs:range xsd:string .
78
+
79
+ # =============================================================================
80
+ # FORM TYPE CLASS
81
+ # =============================================================================
82
+
83
+ sf:FormType
84
+ a owl:Class ;
85
+ rdfs:label "Form Type"@en ;
86
+ rdfs:comment "The type of substance form."@en .
87
+
88
+ sf:AnhydrousForm
89
+ a sf:FormType ;
90
+ rdfs:label "Anhydrous Form"@en ;
91
+ skos:prefLabel "Anhydrous"@en ;
92
+ skos:altLabel "Anhydrous"@en ;
93
+ rdfs:comment "A substance form without water of crystallization."@en .
94
+
95
+ sf:HydrateForm
96
+ a sf:FormType ;
97
+ rdfs:label "Hydrate Form"@en ;
98
+ skos:prefLabel "Hydrate"@en ;
99
+ skos:altLabel "Hydrated"@en ;
100
+ rdfs:comment "A substance form containing water of crystallization."@en .
101
+
102
+ sf:SolvateForm
103
+ a sf:FormType ;
104
+ rdfs:label "Solvate Form"@en ;
105
+ skos:prefLabel "Solvate"@en ;
106
+ rdfs:comment "A substance form containing solvent of crystallization."@en .
107
+
108
+ sf:MonohydrateForm
109
+ a sf:FormType ;
110
+ rdfs:label "Monohydrate Form"@en ;
111
+ skos:prefLabel "Monohydrate"@en ;
112
+ rdfs:comment "A hydrate form with one molecule of water."@en ;
113
+ rdfs:subClassOf sf:HydrateForm .
114
+
115
+ sf:DihydrateForm
116
+ a sf:FormType ;
117
+ rdfs:label "Dihydrate Form"@en ;
118
+ skos:prefLabel "Dihydrate"@en ;
119
+ rdfs:comment "A hydrate form with two molecules of water."@en ;
120
+ rdfs:subClassOf sf:HydrateForm .
121
+
122
+ sf:TrihydrateForm
123
+ a sf:FormType ;
124
+ rdfs:label "Trihydrate Form"@en ;
125
+ skos:prefLabel "Trihydrate"@en ;
126
+ rdfs:comment "A hydrate form with three molecules of water."@en ;
127
+ rdfs:subClassOf sf:HydrateForm .
128
+
129
+ sf:PentahydrateForm
130
+ a sf:FormType ;
131
+ rdfs:label "Pentahydrate Form"@en ;
132
+ skos:prefLabel "Pentahydrate"@en ;
133
+ rdfs:comment "A hydrate form with five molecules of water."@en ;
134
+ rdfs:subClassOf sf:HydrateForm .
135
+
136
+ # =============================================================================
137
+ # WATER/ SOLVENT CONTENT
138
+ # =============================================================================
139
+
140
+ sf:waterContent
141
+ a owl:DatatypeProperty ;
142
+ rdfs:label "water content"@en ;
143
+ rdfs:comment "The water content as a percentage or molecular ratio."@en ;
144
+ rdfs:domain sf:SubstanceForm ;
145
+ rdfs:range xsd:string .
146
+
147
+ sf:waterMolecules
148
+ a owl:DatatypeProperty ;
149
+ rdfs:label "water molecules"@en ;
150
+ rdfs:comment "The number of water molecules per substance molecule."@en ;
151
+ rdfs:domain sf:SubstanceForm ;
152
+ rdfs:range xsd:integer .
153
+
154
+ sf:solventType
155
+ a owl:DatatypeProperty ;
156
+ rdfs:label "solvent type"@en ;
157
+ rdfs:comment "The type of solvent in a solvate form."@en ;
158
+ rdfs:domain sf:SubstanceForm ;
159
+ rdfs:range xsd:string .
160
+
161
+ sf:solventMolecules
162
+ a owl:DatatypeProperty ;
163
+ rdfs:label "solvent molecules"@en ;
164
+ rdfs:comment "The number of solvent molecules per substance molecule."@en ;
165
+ rdfs:domain sf:SubstanceForm ;
166
+ rdfs:range xsd:integer .
167
+
168
+ # =============================================================================
169
+ # SUBSTANCE TYPE VARIANT (Type A, Type B, etc.)
170
+ # =============================================================================
171
+
172
+ sf:SubstanceTypeVariant
173
+ a owl:Class ;
174
+ rdfs:label "Substance Type Variant"@en ;
175
+ rdfs:comment """
176
+ A type variant of a pharmaceutical substance (e.g., Type A, Type B).
177
+ Different types may have different physical properties, particle sizes,
178
+ or crystalline forms while having the same chemical composition.
179
+ """@en .
180
+
181
+ sf:typeVariantOf
182
+ a owl:ObjectProperty ;
183
+ rdfs:label "type variant of"@en ;
184
+ rdfs:comment "The base substance that this is a type variant of."@en ;
185
+ rdfs:domain sf:SubstanceTypeVariant ;
186
+ rdfs:range op:PharmacopoeiaMonograph .
187
+
188
+ sf:variantIdentifier
189
+ a owl:DatatypeProperty ;
190
+ rdfs:label "variant identifier"@en ;
191
+ rdfs:comment "The identifier for this type variant (e.g., 'A', 'B', 'I', 'II')."@en ;
192
+ rdfs:domain sf:SubstanceTypeVariant ;
193
+ rdfs:range xsd:string .
194
+
195
+ sf:particleSizeRange
196
+ a owl:DatatypeProperty ;
197
+ rdfs:label "particle size range"@en ;
198
+ rdfs:comment "The particle size range for this variant."@en ;
199
+ rdfs:domain sf:SubstanceTypeVariant ;
200
+ rdfs:range xsd:string .
201
+
202
+ sf:crystallineForm
203
+ a owl:DatatypeProperty ;
204
+ rdfs:label "crystalline form"@en ;
205
+ rdfs:comment "The crystalline form (e.g., 'amorphous', 'crystalline', 'polymorph I')."@en ;
206
+ rdfs:domain sf:SubstanceTypeVariant ;
207
+ rdfs:range xsd:string .
208
+
209
+ # =============================================================================
210
+ # SALT-BASE EQUIVALENCE
211
+ # =============================================================================
212
+
213
+ sf:SaltBaseEquivalence
214
+ a owl:Class ;
215
+ rdfs:label "Salt-Base Equivalence"@en ;
216
+ rdfs:comment """
217
+ Defines the equivalence between a salt form and its base (free acid or
218
+ free base). This is essential for calculating equivalent doses and
219
+ for comparing different salt forms of the same active moiety.
220
+ """@en .
221
+
222
+ sf:saltForm
223
+ a owl:ObjectProperty ;
224
+ rdfs:label "salt form"@en ;
225
+ rdfs:comment "The salt form of the substance."@en ;
226
+ rdfs:domain sf:SaltBaseEquivalence ;
227
+ rdfs:range op:PharmacopoeiaMonograph .
228
+
229
+ sf:baseForm
230
+ a owl:ObjectProperty ;
231
+ rdfs:label "base form"@en ;
232
+ rdfs:comment "The base form (free acid or free base) of the substance."@en ;
233
+ rdfs:domain sf:SaltBaseEquivalence ;
234
+ rdfs:range op:PharmacopoeiaMonograph .
235
+
236
+ sf:equivalenceFactor
237
+ a owl:DatatypeProperty ;
238
+ rdfs:label "equivalence factor"@en ;
239
+ rdfs:comment """
240
+ The factor to convert from salt form to base form.
241
+ Calculated as: MW(base) / MW(salt)
242
+ """@en ;
243
+ rdfs:domain sf:SaltBaseEquivalence ;
244
+ rdfs:range xsd:decimal .
245
+
246
+ sf:equivalenceRatio
247
+ a owl:DatatypeProperty ;
248
+ rdfs:label "equivalence ratio"@en ;
249
+ rdfs:comment """
250
+ The ratio of salt to base (e.g., '1:1', '2:1').
251
+ Used for stoichiometric calculations.
252
+ """@en ;
253
+ rdfs:domain sf:SaltBaseEquivalence ;
254
+ rdfs:range xsd:string .
255
+
256
+ # =============================================================================
257
+ # EXAMPLE: PARACETAMOL FORMS
258
+ # =============================================================================
259
+
260
+ # Example instance data would look like:
261
+ #
262
+ # op:Paracetamol a op:ChemicalDrugMonograph ;
263
+ # skos:prefLabel "Paracetamol"@en ;
264
+ # sf:hasForm sf:Paracetamol-Anhydrous, sf:Paracetamol-Hydrate .
265
+ #
266
+ # sf:Paracetamol-Anhydrous a sf:SubstanceForm ;
267
+ # sf:formOf op:Paracetamol ;
268
+ # sf:formType sf:AnhydrousForm ;
269
+ # sf:molecularFormula "C8H9NO2" ;
270
+ # sf:molecularWeight 151.16 .
271
+ #
272
+ # sf:Paracetamol-Hydrate a sf:SubstanceForm ;
273
+ # sf:formOf op:Paracetamol ;
274
+ # sf:formType sf:MonohydrateForm ;
275
+ # sf:molecularFormula "C8H9NO2.H2O" ;
276
+ # sf:molecularWeight 169.18 ;
277
+ # sf:waterMolecules 1 .
278
+
279
+ # =============================================================================
280
+ # LINKING PROPERTY ON MONOGRAPH
281
+ # =============================================================================
282
+
283
+ op:hasSubstanceForm
284
+ a owl:ObjectProperty ;
285
+ rdfs:label "has substance form"@en ;
286
+ rdfs:comment "A specific form of this substance."@en ;
287
+ rdfs:domain op:PharmacopoeiaMonograph ;
288
+ rdfs:range sf:SubstanceForm .
289
+
290
+ op:hasTypeVariant
291
+ a owl:ObjectProperty ;
292
+ rdfs:label "has type variant"@en ;
293
+ rdfs:comment "A type variant of this substance."@en ;
294
+ rdfs:domain op:PharmacopoeiaMonograph ;
295
+ rdfs:range sf:SubstanceTypeVariant .
296
+
297
+ op:hasSaltEquivalence
298
+ a owl:ObjectProperty ;
299
+ rdfs:label "has salt equivalence"@en ;
300
+ rdfs:comment "Salt-base equivalence information for this substance."@en ;
301
+ rdfs:domain op:PharmacopoeiaMonograph ;
302
+ rdfs:range sf:SaltBaseEquivalence .