-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
224 lines (168 loc) · 10 KB
/
models.py
File metadata and controls
224 lines (168 loc) · 10 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
import datetime
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
# Create database instance
db = SQLAlchemy()
class User(UserMixin, db.Model):
"""Model for user accounts."""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False, index=True)
email = db.Column(db.String(120), unique=True, nullable=False, index=True)
password_hash = db.Column(db.String(256), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
last_login = db.Column(db.DateTime, nullable=True)
# Relationships
ontology_files = db.relationship('OntologyFile', backref='user', lazy='select')
fol_expressions = db.relationship('FOLExpression', backref='user', lazy='select')
# Sandbox ontologies relationship is defined in the SandboxOntology model
def set_password(self, password):
"""Set the user's password hash from a plain text password."""
self.password_hash = generate_password_hash(password)
def check_password(self, password):
"""Check if the provided password matches the stored hash."""
return check_password_hash(self.password_hash, password)
def __repr__(self):
return f"<User {self.username}>"
class OntologyFile(db.Model):
"""Model for storing uploaded ontology files."""
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(255), nullable=False)
original_filename = db.Column(db.String(255), nullable=False)
file_path = db.Column(db.String(500), nullable=False)
file_size = db.Column(db.Integer, nullable=False) # Size in bytes
upload_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
mime_type = db.Column(db.String(100), nullable=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True) # Can be null for legacy files
from_sandbox = db.Column(db.Boolean, default=False) # Flag to indicate if the file came from sandbox
sandbox_ontology_id = db.Column(db.Integer, db.ForeignKey('sandbox_ontology.id'), nullable=True) # Link to source sandbox if applicable
# Relationship with analysis results
analyses = db.relationship('OntologyAnalysis', backref='ontology_file', lazy='select', cascade="all, delete-orphan")
def __repr__(self):
return f"<OntologyFile {self.original_filename}>"
class OntologyAnalysis(db.Model):
"""Model for storing ontology analysis results."""
id = db.Column(db.Integer, primary_key=True)
ontology_file_id = db.Column(db.Integer, db.ForeignKey('ontology_file.id'), nullable=False)
analysis_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
# Basic ontology information
ontology_name = db.Column(db.String(255), nullable=True)
ontology_iri = db.Column(db.String(500), nullable=True)
is_consistent = db.Column(db.Boolean, nullable=True, default=True)
# Statistics
class_count = db.Column(db.Integer, default=0)
object_property_count = db.Column(db.Integer, default=0)
data_property_count = db.Column(db.Integer, default=0)
individual_count = db.Column(db.Integer, default=0)
annotation_property_count = db.Column(db.Integer, default=0)
axiom_count = db.Column(db.Integer, default=0)
# Metrics
expressivity = db.Column(db.String(50), nullable=True)
complexity = db.Column(db.Integer, default=0)
# Store detailed results as JSON
axioms = db.Column(db.JSON, nullable=True)
consistency_issues = db.Column(db.JSON, nullable=True)
inferred_axioms = db.Column(db.JSON, nullable=True)
fol_premises = db.Column(db.JSON, nullable=True)
real_world_implications = db.Column(db.JSON, nullable=True)
implications_generated = db.Column(db.Boolean, default=False)
implications_generation_date = db.Column(db.DateTime, nullable=True)
# Entity lists for direct display
class_list = db.Column(db.JSON, nullable=True)
object_property_list = db.Column(db.JSON, nullable=True)
data_property_list = db.Column(db.JSON, nullable=True)
individual_list = db.Column(db.JSON, nullable=True)
# Transparency fields
reasoning_methodology = db.Column(db.JSON, nullable=True)
derivation_steps = db.Column(db.JSON, nullable=True)
def __repr__(self):
return f"<OntologyAnalysis {self.id} for {self.ontology_file_id}>"
class FOLExpression(db.Model):
"""Model for storing tested FOL expressions."""
id = db.Column(db.Integer, primary_key=True)
expression = db.Column(db.Text, nullable=False)
test_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
is_valid = db.Column(db.Boolean, default=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True) # Can be null for legacy expressions
# Store test results as JSON
test_results = db.Column(db.JSON, nullable=True)
issues = db.Column(db.JSON, nullable=True)
bfo_classes_used = db.Column(db.JSON, nullable=True)
bfo_relations_used = db.Column(db.JSON, nullable=True)
non_bfo_terms = db.Column(db.JSON, nullable=True)
def __repr__(self):
return f"<FOLExpression {self.id}: {self.expression[:30]}...>"
class SandboxOntology(db.Model):
"""Model for storing sandbox ontology development projects."""
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255), nullable=False)
domain = db.Column(db.String(100), nullable=False)
subject = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text, nullable=True)
creation_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
last_modified = db.Column(db.DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True) # Can be null for anonymous users
# Store the ontology structure as JSON
classes = db.Column(db.JSON, default=list)
properties = db.Column(db.JSON, default=list)
individuals = db.Column(db.JSON, default=list)
# Reference to the user (optional)
user = db.relationship('User', backref=db.backref('sandbox_ontologies', lazy=True))
# Reference to exported ontology files
exported_files = db.relationship('OntologyFile', backref='sandbox_source', lazy=True)
def __repr__(self):
return f"<SandboxOntology {self.id}: {self.title}>"
class OntologyClass(db.Model):
"""Model for storing class definitions in sandbox ontologies."""
id = db.Column(db.Integer, primary_key=True)
ontology_id = db.Column(db.Integer, db.ForeignKey('sandbox_ontology.id'), nullable=False)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.Text, nullable=True)
bfo_category = db.Column(db.String(100), nullable=True) # Link to BFO class if applicable
creation_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
# Parent class (for subclass relationships)
parent_id = db.Column(db.Integer, db.ForeignKey('ontology_class.id'), nullable=True)
children = db.relationship('OntologyClass', backref=db.backref('parent', remote_side=[id]), lazy=True)
# Reference to the ontology
ontology = db.relationship('SandboxOntology', backref=db.backref('ontology_classes', lazy=True, cascade="all, delete-orphan"))
# Custom properties as JSON
properties = db.Column(db.JSON, default=dict)
def __repr__(self):
return f"<OntologyClass {self.id}: {self.name}>"
class OntologyProperty(db.Model):
"""Model for storing property/relationship definitions in sandbox ontologies."""
id = db.Column(db.Integer, primary_key=True)
ontology_id = db.Column(db.Integer, db.ForeignKey('sandbox_ontology.id'), nullable=False)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.Text, nullable=True)
property_type = db.Column(db.String(50), nullable=False) # 'object', 'data', 'annotation'
creation_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
# Domain and range (for object properties)
domain_class_id = db.Column(db.Integer, db.ForeignKey('ontology_class.id'), nullable=True)
range_class_id = db.Column(db.Integer, db.ForeignKey('ontology_class.id'), nullable=True)
# References to domain and range classes
domain_class = db.relationship('OntologyClass', foreign_keys=[domain_class_id], backref=db.backref('as_domain_properties', lazy=True))
range_class = db.relationship('OntologyClass', foreign_keys=[range_class_id], backref=db.backref('as_range_properties', lazy=True))
# Reference to the ontology
ontology = db.relationship('SandboxOntology', backref=db.backref('ontology_properties', lazy=True, cascade="all, delete-orphan"))
# Custom property metadata as JSON
property_metadata = db.Column(db.JSON, default=dict)
def __repr__(self):
return f"<OntologyProperty {self.id}: {self.name}>"
class OntologyIndividual(db.Model):
"""Model for storing individual instances in sandbox ontologies."""
id = db.Column(db.Integer, primary_key=True)
ontology_id = db.Column(db.Integer, db.ForeignKey('sandbox_ontology.id'), nullable=False)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.Text, nullable=True)
creation_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
# Class membership
class_id = db.Column(db.Integer, db.ForeignKey('ontology_class.id'), nullable=False)
# Reference to the class
ontology_class = db.relationship('OntologyClass', backref=db.backref('individuals', lazy=True))
# Reference to the ontology
ontology = db.relationship('SandboxOntology', backref=db.backref('ontology_individuals', lazy=True, cascade="all, delete-orphan"))
# Property values as JSON
property_values = db.Column(db.JSON, default=dict)
def __repr__(self):
return f"<OntologyIndividual {self.id}: {self.name}>"