-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchoice_db.py
49 lines (36 loc) · 1.82 KB
/
choice_db.py
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
from typing import Dict, Iterable, List, Union
from owlready2 import onto_path, get_ontology
from os import getcwd
CURRENT_DIRECTORY = getcwd()
onto_path.append(CURRENT_DIRECTORY)
DBMSDictType = Dict[str, Union[str, List[str], int]]
def get_dict_for_dbms(dbms) -> DBMSDictType:
characteristics_descriptions = [
characteristic.comment[0] if characteristic.comment else ''
for characteristic in dbms.implements
]
return {
'name': str(dbms).split('.')[-1],
'characteristics': characteristics_descriptions,
'popularity': dbms.popularity or 0,
'description': dbms.comment[0] if dbms.comment else '',
}
def get_dbms(requirements: Iterable[str], dbms_count: int = 3) -> List[DBMSDictType]:
"""
На основе списка требований получает упорядоченный список баз данных
:param requirements: список строк, которым должны соответсвовать требования из онтологии
:param dbms_count: количество СУБД, которые нужно вернуть. По умолчанию 3
:return: список словарей, где хранится информация о базе данных
"""
ontology = get_ontology(f'{CURRENT_DIRECTORY}/db_choice.owl')
ontology.load()
onto_requirements = [ontology.search_one(iri=f'*{requirement}') for requirement in requirements]
dbms_class = ontology.search_one(iri='*DBMS')
all_dbms = ontology.search(is_a=dbms_class)[1:]
sorted_dbms = sorted(
all_dbms,
reverse=True,
key=lambda dbms: len(set(dbms.satisfies) & set(onto_requirements)),
)
chosen_dbms = sorted_dbms[:dbms_count]
return [get_dict_for_dbms(dbms) for dbms in chosen_dbms]