inputlayer-client-dev 0.1.0__py3-none-any.whl
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.
- inputlayer/__init__.py +151 -0
- inputlayer/_ast.py +133 -0
- inputlayer/_naming.py +44 -0
- inputlayer/_protocol.py +225 -0
- inputlayer/_proxy.py +244 -0
- inputlayer/aggregations.py +126 -0
- inputlayer/auth.py +70 -0
- inputlayer/client.py +178 -0
- inputlayer/client_sync.py +231 -0
- inputlayer/compiler.py +672 -0
- inputlayer/connection.py +314 -0
- inputlayer/derived.py +141 -0
- inputlayer/exceptions.py +76 -0
- inputlayer/functions.py +285 -0
- inputlayer/index.py +40 -0
- inputlayer/knowledge_graph.py +589 -0
- inputlayer/migrations/__init__.py +51 -0
- inputlayer/migrations/autodetector.py +120 -0
- inputlayer/migrations/cli.py +254 -0
- inputlayer/migrations/executor.py +95 -0
- inputlayer/migrations/loader.py +91 -0
- inputlayer/migrations/operations.py +298 -0
- inputlayer/migrations/recorder.py +44 -0
- inputlayer/migrations/state.py +107 -0
- inputlayer/migrations/writer.py +183 -0
- inputlayer/notifications.py +83 -0
- inputlayer/py.typed +0 -0
- inputlayer/relation.py +102 -0
- inputlayer/result.py +89 -0
- inputlayer/session.py +75 -0
- inputlayer/types.py +192 -0
- inputlayer_client_dev-0.1.0.dist-info/METADATA +364 -0
- inputlayer_client_dev-0.1.0.dist-info/RECORD +35 -0
- inputlayer_client_dev-0.1.0.dist-info/WHEEL +4 -0
- inputlayer_client_dev-0.1.0.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"""InputLayerSync / KnowledgeGraphSync - synchronous wrappers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
from typing import Any, Callable, Iterator
|
|
7
|
+
|
|
8
|
+
from inputlayer.auth import AclEntry, ApiKeyInfo, UserInfo
|
|
9
|
+
from inputlayer.client import InputLayer
|
|
10
|
+
from inputlayer.index import HnswIndex
|
|
11
|
+
from inputlayer.knowledge_graph import (
|
|
12
|
+
ClearResult,
|
|
13
|
+
DeleteResult,
|
|
14
|
+
ExplainResult,
|
|
15
|
+
IndexInfo,
|
|
16
|
+
IndexStats,
|
|
17
|
+
InsertResult,
|
|
18
|
+
RelationDescription,
|
|
19
|
+
RelationInfo,
|
|
20
|
+
RuleInfo,
|
|
21
|
+
ServerStatus,
|
|
22
|
+
)
|
|
23
|
+
from inputlayer.relation import Relation
|
|
24
|
+
from inputlayer.result import ResultSet
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_or_create_loop() -> asyncio.AbstractEventLoop:
|
|
28
|
+
"""Get or create an event loop for sync wrappers."""
|
|
29
|
+
try:
|
|
30
|
+
loop = asyncio.get_event_loop()
|
|
31
|
+
if loop.is_closed():
|
|
32
|
+
raise RuntimeError("closed")
|
|
33
|
+
return loop
|
|
34
|
+
except RuntimeError:
|
|
35
|
+
loop = asyncio.new_event_loop()
|
|
36
|
+
asyncio.set_event_loop(loop)
|
|
37
|
+
return loop
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class KnowledgeGraphSync:
|
|
41
|
+
"""Synchronous wrapper around KnowledgeGraph."""
|
|
42
|
+
|
|
43
|
+
def __init__(self, kg: Any, loop: asyncio.AbstractEventLoop) -> None:
|
|
44
|
+
self._kg = kg
|
|
45
|
+
self._loop = loop
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def name(self) -> str:
|
|
49
|
+
return self._kg.name
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def session(self) -> Any:
|
|
53
|
+
return self._kg.session # TODO: SessionSync wrapper
|
|
54
|
+
|
|
55
|
+
def define(self, *relations: type[Relation]) -> None:
|
|
56
|
+
self._loop.run_until_complete(self._kg.define(*relations))
|
|
57
|
+
|
|
58
|
+
def relations(self) -> list[RelationInfo]:
|
|
59
|
+
return self._loop.run_until_complete(self._kg.relations())
|
|
60
|
+
|
|
61
|
+
def describe(self, relation: type[Relation] | str) -> RelationDescription:
|
|
62
|
+
return self._loop.run_until_complete(self._kg.describe(relation))
|
|
63
|
+
|
|
64
|
+
def drop_relation(self, relation: type[Relation] | str) -> None:
|
|
65
|
+
self._loop.run_until_complete(self._kg.drop_relation(relation))
|
|
66
|
+
|
|
67
|
+
def insert(self, facts: Any, data: Any = None) -> InsertResult:
|
|
68
|
+
return self._loop.run_until_complete(self._kg.insert(facts, data=data))
|
|
69
|
+
|
|
70
|
+
def delete(self, facts: Any, *, where: Callable | None = None) -> DeleteResult:
|
|
71
|
+
return self._loop.run_until_complete(self._kg.delete(facts, where=where))
|
|
72
|
+
|
|
73
|
+
def query(self, *select: Any, **kwargs: Any) -> ResultSet:
|
|
74
|
+
return self._loop.run_until_complete(self._kg.query(*select, **kwargs))
|
|
75
|
+
|
|
76
|
+
def vector_search(self, relation: type[Relation], query_vec: list[float], **kwargs: Any) -> ResultSet:
|
|
77
|
+
return self._loop.run_until_complete(self._kg.vector_search(relation, query_vec, **kwargs))
|
|
78
|
+
|
|
79
|
+
def define_rules(self, *targets: Any) -> None:
|
|
80
|
+
self._loop.run_until_complete(self._kg.define_rules(*targets))
|
|
81
|
+
|
|
82
|
+
def list_rules(self) -> list[RuleInfo]:
|
|
83
|
+
return self._loop.run_until_complete(self._kg.list_rules())
|
|
84
|
+
|
|
85
|
+
def rule_definition(self, name: str | type) -> list[str]:
|
|
86
|
+
return self._loop.run_until_complete(self._kg.rule_definition(name))
|
|
87
|
+
|
|
88
|
+
def drop_rule(self, name: str | type) -> None:
|
|
89
|
+
self._loop.run_until_complete(self._kg.drop_rule(name))
|
|
90
|
+
|
|
91
|
+
def drop_rule_clause(self, name: str | type, index: int) -> None:
|
|
92
|
+
self._loop.run_until_complete(self._kg.drop_rule_clause(name, index))
|
|
93
|
+
|
|
94
|
+
def clear_rule(self, name: str | type) -> None:
|
|
95
|
+
self._loop.run_until_complete(self._kg.clear_rule(name))
|
|
96
|
+
|
|
97
|
+
def drop_rules_by_prefix(self, prefix: str) -> None:
|
|
98
|
+
self._loop.run_until_complete(self._kg.drop_rules_by_prefix(prefix))
|
|
99
|
+
|
|
100
|
+
def create_index(self, index: HnswIndex) -> None:
|
|
101
|
+
self._loop.run_until_complete(self._kg.create_index(index))
|
|
102
|
+
|
|
103
|
+
def list_indexes(self) -> list[IndexInfo]:
|
|
104
|
+
return self._loop.run_until_complete(self._kg.list_indexes())
|
|
105
|
+
|
|
106
|
+
def index_stats(self, name: str) -> IndexStats:
|
|
107
|
+
return self._loop.run_until_complete(self._kg.index_stats(name))
|
|
108
|
+
|
|
109
|
+
def drop_index(self, name: str) -> None:
|
|
110
|
+
self._loop.run_until_complete(self._kg.drop_index(name))
|
|
111
|
+
|
|
112
|
+
def rebuild_index(self, name: str) -> None:
|
|
113
|
+
self._loop.run_until_complete(self._kg.rebuild_index(name))
|
|
114
|
+
|
|
115
|
+
def grant_access(self, username: str, role: str) -> None:
|
|
116
|
+
self._loop.run_until_complete(self._kg.grant_access(username, role))
|
|
117
|
+
|
|
118
|
+
def revoke_access(self, username: str) -> None:
|
|
119
|
+
self._loop.run_until_complete(self._kg.revoke_access(username))
|
|
120
|
+
|
|
121
|
+
def list_acl(self) -> list[AclEntry]:
|
|
122
|
+
return self._loop.run_until_complete(self._kg.list_acl())
|
|
123
|
+
|
|
124
|
+
def explain(self, *select: Any, **kwargs: Any) -> ExplainResult:
|
|
125
|
+
return self._loop.run_until_complete(self._kg.explain(*select, **kwargs))
|
|
126
|
+
|
|
127
|
+
def compact(self) -> None:
|
|
128
|
+
self._loop.run_until_complete(self._kg.compact())
|
|
129
|
+
|
|
130
|
+
def status(self) -> ServerStatus:
|
|
131
|
+
return self._loop.run_until_complete(self._kg.status())
|
|
132
|
+
|
|
133
|
+
def load(self, path: str, *, mode: str | None = None) -> None:
|
|
134
|
+
self._loop.run_until_complete(self._kg.load(path, mode=mode))
|
|
135
|
+
|
|
136
|
+
def clear_prefix(self, prefix: str) -> ClearResult:
|
|
137
|
+
return self._loop.run_until_complete(self._kg.clear_prefix(prefix))
|
|
138
|
+
|
|
139
|
+
def execute(self, datalog: str) -> ResultSet:
|
|
140
|
+
return self._loop.run_until_complete(self._kg.execute(datalog))
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class InputLayerSync:
|
|
144
|
+
"""Synchronous wrapper around InputLayer."""
|
|
145
|
+
|
|
146
|
+
def __init__(
|
|
147
|
+
self,
|
|
148
|
+
url: str,
|
|
149
|
+
*,
|
|
150
|
+
username: str | None = None,
|
|
151
|
+
password: str | None = None,
|
|
152
|
+
api_key: str | None = None,
|
|
153
|
+
auto_reconnect: bool = True,
|
|
154
|
+
reconnect_delay: float = 1.0,
|
|
155
|
+
max_reconnect_attempts: int = 10,
|
|
156
|
+
initial_kg: str | None = None,
|
|
157
|
+
) -> None:
|
|
158
|
+
self._loop = _get_or_create_loop()
|
|
159
|
+
self._client = InputLayer(
|
|
160
|
+
url,
|
|
161
|
+
username=username,
|
|
162
|
+
password=password,
|
|
163
|
+
api_key=api_key,
|
|
164
|
+
auto_reconnect=auto_reconnect,
|
|
165
|
+
reconnect_delay=reconnect_delay,
|
|
166
|
+
max_reconnect_attempts=max_reconnect_attempts,
|
|
167
|
+
initial_kg=initial_kg,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
def connect(self) -> None:
|
|
171
|
+
self._loop.run_until_complete(self._client.connect())
|
|
172
|
+
|
|
173
|
+
def close(self) -> None:
|
|
174
|
+
self._loop.run_until_complete(self._client.close())
|
|
175
|
+
|
|
176
|
+
def __enter__(self) -> InputLayerSync:
|
|
177
|
+
self.connect()
|
|
178
|
+
return self
|
|
179
|
+
|
|
180
|
+
def __exit__(self, *exc: Any) -> None:
|
|
181
|
+
self.close()
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def connected(self) -> bool:
|
|
185
|
+
return self._client.connected
|
|
186
|
+
|
|
187
|
+
@property
|
|
188
|
+
def session_id(self) -> str | None:
|
|
189
|
+
return self._client.session_id
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def server_version(self) -> str | None:
|
|
193
|
+
return self._client.server_version
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def role(self) -> str | None:
|
|
197
|
+
return self._client.role
|
|
198
|
+
|
|
199
|
+
def knowledge_graph(self, name: str, *, create: bool = True) -> KnowledgeGraphSync:
|
|
200
|
+
kg = self._client.knowledge_graph(name, create=create)
|
|
201
|
+
return KnowledgeGraphSync(kg, self._loop)
|
|
202
|
+
|
|
203
|
+
def list_knowledge_graphs(self) -> list[str]:
|
|
204
|
+
return self._loop.run_until_complete(self._client.list_knowledge_graphs())
|
|
205
|
+
|
|
206
|
+
def drop_knowledge_graph(self, name: str) -> None:
|
|
207
|
+
self._loop.run_until_complete(self._client.drop_knowledge_graph(name))
|
|
208
|
+
|
|
209
|
+
def create_user(self, username: str, password: str, role: str = "viewer") -> None:
|
|
210
|
+
self._loop.run_until_complete(self._client.create_user(username, password, role))
|
|
211
|
+
|
|
212
|
+
def drop_user(self, username: str) -> None:
|
|
213
|
+
self._loop.run_until_complete(self._client.drop_user(username))
|
|
214
|
+
|
|
215
|
+
def set_password(self, username: str, new_password: str) -> None:
|
|
216
|
+
self._loop.run_until_complete(self._client.set_password(username, new_password))
|
|
217
|
+
|
|
218
|
+
def set_role(self, username: str, role: str) -> None:
|
|
219
|
+
self._loop.run_until_complete(self._client.set_role(username, role))
|
|
220
|
+
|
|
221
|
+
def list_users(self) -> list[UserInfo]:
|
|
222
|
+
return self._loop.run_until_complete(self._client.list_users())
|
|
223
|
+
|
|
224
|
+
def create_api_key(self, label: str) -> str:
|
|
225
|
+
return self._loop.run_until_complete(self._client.create_api_key(label))
|
|
226
|
+
|
|
227
|
+
def list_api_keys(self) -> list[ApiKeyInfo]:
|
|
228
|
+
return self._loop.run_until_complete(self._client.list_api_keys())
|
|
229
|
+
|
|
230
|
+
def revoke_api_key(self, label: str) -> None:
|
|
231
|
+
self._loop.run_until_complete(self._client.revoke_api_key(label))
|