weaviate-ruby 0.6.0 → 0.7.1
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +62 -22
- data/lib/weaviate/client.rb +5 -0
- data/lib/weaviate/objects.rb +92 -28
- data/lib/weaviate/query.rb +63 -4
- data/lib/weaviate/schema.rb +32 -14
- data/lib/weaviate/version.rb +1 -1
- data/lib/weaviate.rb +0 -7
- metadata +2 -6
- data/lib/weaviate/response/base.rb +0 -23
- data/lib/weaviate/response/class.rb +0 -8
- data/lib/weaviate/response/collection.rb +0 -22
- data/lib/weaviate/response/object.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb982e0efa4f7af24b5e5ddc344da70ada13abaf498c2b2cc23eabb0659a78f6
|
4
|
+
data.tar.gz: cb1caf49e8e3585f95f7a43d5b6c02acbfe52c4095c3594bd98ba3becc489c09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ee15a3b1c4b1a8df15e836e82073310911f7ccb298c49f44cc290533ce407ae5e7410b50424455ac228348ccd2c36b7adc693ffac668876e2af6306b6d7d28e
|
7
|
+
data.tar.gz: f9cae1a701db54b908409f1e631d7d1103e6ebef16949d273e565f994bb7eb5cae863372b1141a9646d2509c7b5570a88031855bfa8c4f88a39e71c8c0f70610
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
# Weaviate
|
2
2
|
|
3
|
+
<p>
|
4
|
+
<img alt='Weaviate logo' src='https://weaviate.io/img/site/weaviate-logo-light.png' height='50' />
|
5
|
+
+
|
6
|
+
<img alt='Ruby logo' src='https://user-images.githubusercontent.com/541665/230231593-43861278-4550-421d-a543-fd3553aac4f6.png' height='40' />
|
7
|
+
</p>
|
8
|
+
|
3
9
|
Ruby wrapper for the Weaviate.io API
|
4
10
|
|
11
|
+

|
12
|
+
|
5
13
|
## Installation
|
6
14
|
|
7
15
|
Install the gem and add to the application's Gemfile by executing:
|
@@ -14,7 +22,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
14
22
|
|
15
23
|
## Usage
|
16
24
|
|
17
|
-
### Instantiating
|
25
|
+
### Instantiating API client
|
18
26
|
|
19
27
|
```ruby
|
20
28
|
require 'weaviate'
|
@@ -40,7 +48,7 @@ client.schema.create(
|
|
40
48
|
"dataType": ["text"],
|
41
49
|
"description": "The question",
|
42
50
|
"name": "question"
|
43
|
-
}
|
51
|
+
}, {
|
44
52
|
"dataType": ["text"],
|
45
53
|
"description": "The answer",
|
46
54
|
"name": "answer"
|
@@ -57,15 +65,27 @@ client.schema.create(
|
|
57
65
|
# Get a single class from the schema
|
58
66
|
client.schema.get(class_name: 'Question')
|
59
67
|
|
60
|
-
#
|
61
|
-
|
62
|
-
response.data
|
68
|
+
# Get the schema
|
69
|
+
client.schema.list()
|
63
70
|
|
64
71
|
# Remove a class (and all data in the instances) from the schema.
|
65
72
|
client.schema.delete(class_name: 'Question')
|
66
73
|
|
67
74
|
# Update settings of an existing schema class.
|
68
|
-
|
75
|
+
# Does not support modifying existing properties.
|
76
|
+
client.schema.update(
|
77
|
+
class_name: 'Question',
|
78
|
+
description: 'Information from a Wheel of Fortune question'
|
79
|
+
)
|
80
|
+
|
81
|
+
# Adding a new property
|
82
|
+
client.schema.add_property(
|
83
|
+
class_name: 'Question',
|
84
|
+
property: {
|
85
|
+
"dataType": ["boolean"],
|
86
|
+
"name": "homepage"
|
87
|
+
}
|
88
|
+
)
|
69
89
|
|
70
90
|
# Inspect the shards of a class
|
71
91
|
client.schema.shards(class_name: 'Question')
|
@@ -84,31 +104,30 @@ client.objects.create(
|
|
84
104
|
)
|
85
105
|
|
86
106
|
# Lists all data objects in reverse order of creation.
|
87
|
-
|
88
|
-
response.data
|
107
|
+
client.objects.list()
|
89
108
|
|
90
109
|
# Get a single data object.
|
91
110
|
client.objects.get(
|
92
111
|
class_name: "Question",
|
93
|
-
id:
|
112
|
+
id: "uuid"
|
94
113
|
)
|
95
114
|
|
96
|
-
# Check if a data object exists
|
115
|
+
# Check if a data object exists.
|
97
116
|
client.objects.exists?(
|
98
117
|
class_name: "Question",
|
99
|
-
id:
|
118
|
+
id: "uuid"
|
100
119
|
)
|
101
120
|
|
102
|
-
# Delete
|
121
|
+
# Delete a single data object from Weaviate.
|
103
122
|
client.objects.delete(
|
104
123
|
class_name: "Question",
|
105
|
-
id: ""
|
124
|
+
id: "uuid"
|
106
125
|
)
|
107
126
|
|
108
|
-
# Update
|
127
|
+
# Update a single data object based on its uuid.
|
109
128
|
client.objects.update(
|
110
129
|
class_name: "Question",
|
111
|
-
id:
|
130
|
+
id: "uuid",
|
112
131
|
properties: {
|
113
132
|
question: "What does 6 times 7 equal to?",
|
114
133
|
category: "math",
|
@@ -117,7 +136,7 @@ client.objects.update(
|
|
117
136
|
)
|
118
137
|
|
119
138
|
# Batch create objects
|
120
|
-
|
139
|
+
client.objects.batch_create(objects: [
|
121
140
|
{
|
122
141
|
class: "Question",
|
123
142
|
properties: {
|
@@ -134,13 +153,12 @@ response = client.objects.batch_create(objects: [
|
|
134
153
|
}
|
135
154
|
}
|
136
155
|
])
|
137
|
-
response.data
|
138
156
|
|
139
157
|
# Batch delete objects
|
140
158
|
client.objects.batch_delete(
|
141
159
|
class_name: "Question",
|
142
160
|
where: {
|
143
|
-
valueString: "
|
161
|
+
valueString: "uuid",
|
144
162
|
operator: "Equal",
|
145
163
|
path: ["id"]
|
146
164
|
}
|
@@ -149,7 +167,7 @@ client.objects.batch_delete(
|
|
149
167
|
|
150
168
|
### Querying
|
151
169
|
|
152
|
-
#### Get
|
170
|
+
#### Get{}
|
153
171
|
```ruby
|
154
172
|
near_text = '{ concepts: ["biology"] }'
|
155
173
|
sort_obj = '{ path: ["category"], order: desc }'
|
@@ -157,7 +175,7 @@ where_obj = '{ path: ["id"], operator: Equal, valueString: "..." }'
|
|
157
175
|
|
158
176
|
client.query.get(
|
159
177
|
class_name: 'Question',
|
160
|
-
fields:
|
178
|
+
fields: "question answer category _additional { answer { result hasAnswer property startPosition endPosition } }",
|
161
179
|
limit: "1",
|
162
180
|
offset: "1",
|
163
181
|
after: "id",
|
@@ -176,6 +194,8 @@ client.query.get(
|
|
176
194
|
# bm25: ...,
|
177
195
|
|
178
196
|
# near_object: ...,
|
197
|
+
|
198
|
+
ask: '{ question: "your-question?" }'
|
179
199
|
)
|
180
200
|
|
181
201
|
# Example queries:
|
@@ -187,19 +207,29 @@ client.query.get class_name: 'Question', fields: 'answer question category _addi
|
|
187
207
|
|
188
208
|
```
|
189
209
|
|
190
|
-
#### Aggs
|
210
|
+
#### Aggs{}
|
191
211
|
```ruby
|
192
212
|
client.query.aggs(
|
193
213
|
class_name: "Question",
|
194
|
-
fields: 'meta { count }'
|
214
|
+
fields: 'meta { count }',
|
195
215
|
group_by: ["category"],
|
196
216
|
object_limit: "10",
|
197
217
|
near_text: "{ concepts: [\"knowledge\"] }"
|
198
218
|
)
|
199
219
|
```
|
200
220
|
|
221
|
+
#### Explore{}
|
222
|
+
```ruby
|
223
|
+
client.query.explore(
|
224
|
+
fields: 'className',
|
225
|
+
near_text: "{ concepts: [\"science\"] }",
|
226
|
+
limit: "1"
|
227
|
+
)
|
228
|
+
```
|
229
|
+
|
201
230
|
### Classification
|
202
231
|
```ruby
|
232
|
+
# Start a classification
|
203
233
|
client.classifications.create(
|
204
234
|
type: "zeroshot",
|
205
235
|
class_name: "Posts",
|
@@ -207,6 +237,7 @@ client.classifications.create(
|
|
207
237
|
based_on_properties: ["text"]
|
208
238
|
)
|
209
239
|
|
240
|
+
# Get the status, results and metadata of a previously created classification
|
210
241
|
client.classifications.get(
|
211
242
|
id: ""
|
212
243
|
)
|
@@ -214,22 +245,26 @@ client.classifications.get(
|
|
214
245
|
|
215
246
|
### Backups
|
216
247
|
```ruby
|
248
|
+
# Create backup
|
217
249
|
client.backups.create(
|
218
250
|
backend: "filesystem",
|
219
251
|
id: "my-first-backup",
|
220
252
|
include: ["Question"]
|
221
253
|
)
|
222
254
|
|
255
|
+
# Get the backup
|
223
256
|
client.backups.get(
|
224
257
|
backend: "filesystem",
|
225
258
|
id: "my-first-backup"
|
226
259
|
)
|
227
260
|
|
261
|
+
# Restore backup
|
228
262
|
client.backups.restore(
|
229
263
|
backend: "filesystem",
|
230
264
|
id: "my-first-backup"
|
231
265
|
)
|
232
266
|
|
267
|
+
# Check the backup restore status
|
233
268
|
client.backups.restore_status(
|
234
269
|
backend: "filesystem",
|
235
270
|
id: "my-first-backup"
|
@@ -243,7 +278,12 @@ client.nodes
|
|
243
278
|
|
244
279
|
### Health
|
245
280
|
```ruby
|
281
|
+
# Live determines whether the application is alive. It can be used for Kubernetes liveness probe.
|
246
282
|
client.live?
|
283
|
+
```
|
284
|
+
|
285
|
+
```ruby
|
286
|
+
# Live determines whether the application is ready to receive traffic. It can be used for Kubernetes readiness probe.
|
247
287
|
client.ready?
|
248
288
|
```
|
249
289
|
|
data/lib/weaviate/client.rb
CHANGED
@@ -79,10 +79,15 @@ module Weaviate
|
|
79
79
|
|
80
80
|
def graphql
|
81
81
|
headers = {}
|
82
|
+
|
82
83
|
if model_service && model_service_api_key
|
83
84
|
headers[API_KEY_HEADERS[model_service]] = model_service_api_key
|
84
85
|
end
|
85
86
|
|
87
|
+
if api_key
|
88
|
+
headers["Authorization"] = "Bearer #{api_key}"
|
89
|
+
end
|
90
|
+
|
86
91
|
@graphql ||= Graphlient::Client.new(
|
87
92
|
"#{scheme}://#{host}/#{API_VERSION}/graphql",
|
88
93
|
headers: headers,
|
data/lib/weaviate/objects.rb
CHANGED
@@ -23,17 +23,27 @@ module Weaviate
|
|
23
23
|
req.params["sort"] = sort unless sort.nil?
|
24
24
|
req.params["order"] = order unless order.nil?
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
|
+
response.body
|
27
28
|
end
|
28
29
|
|
29
30
|
# Create a new data object. The provided meta-data and schema values are validated.
|
30
31
|
def create(
|
31
32
|
class_name:,
|
32
33
|
properties:,
|
34
|
+
consistency_level: nil,
|
33
35
|
id: nil,
|
34
36
|
vector: nil
|
35
37
|
)
|
38
|
+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
39
|
+
|
36
40
|
response = client.connection.post(PATH) do |req|
|
41
|
+
unless consistency_level.nil?
|
42
|
+
req.params = {
|
43
|
+
consistency_level: consistency_level.to_s.upcase
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
37
47
|
req.body = {}
|
38
48
|
req.body["class"] = class_name
|
39
49
|
req.body["properties"] = properties
|
@@ -41,45 +51,53 @@ module Weaviate
|
|
41
51
|
req.body["vector"] = vector unless vector.nil?
|
42
52
|
end
|
43
53
|
|
44
|
-
|
45
|
-
Weaviate::Response::Object.new(response.body)
|
46
|
-
else
|
47
|
-
response.body
|
48
|
-
end
|
54
|
+
response.body
|
49
55
|
end
|
50
56
|
|
51
57
|
# Batch create objects
|
52
|
-
def batch_create(
|
58
|
+
def batch_create(
|
59
|
+
objects:,
|
60
|
+
consistency_level: nil
|
61
|
+
)
|
62
|
+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
63
|
+
|
53
64
|
response = client.connection.post("batch/#{PATH}") do |req|
|
65
|
+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
54
66
|
req.body = {objects: objects}
|
55
67
|
end
|
56
68
|
|
57
|
-
|
58
|
-
Response::Collection.from_response(response.body, type: Response::Object)
|
59
|
-
end
|
69
|
+
response.body
|
60
70
|
end
|
61
71
|
|
62
72
|
# Get a single data object.
|
63
73
|
def get(
|
64
74
|
class_name:,
|
65
75
|
id:,
|
66
|
-
include: nil
|
76
|
+
include: nil,
|
77
|
+
consistency_level: nil
|
67
78
|
)
|
68
|
-
|
69
|
-
# include | query | param | string | Include additional information, such as classification info. Allowed values include: classification, vector.
|
79
|
+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
70
80
|
|
71
81
|
response = client.connection.get("#{PATH}/#{class_name}/#{id}") do |req|
|
82
|
+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
72
83
|
req.params["include"] = include unless include.nil?
|
73
84
|
end
|
74
85
|
|
75
|
-
|
76
|
-
Weaviate::Response::Object.new(response.body)
|
77
|
-
end
|
86
|
+
response.body
|
78
87
|
end
|
79
88
|
|
80
89
|
# Check if a data object exists
|
81
|
-
def exists?(
|
82
|
-
|
90
|
+
def exists?(
|
91
|
+
class_name:,
|
92
|
+
id:,
|
93
|
+
consistency_level: nil
|
94
|
+
)
|
95
|
+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
96
|
+
|
97
|
+
response = client.connection.head("#{PATH}/#{class_name}/#{id}") do |req|
|
98
|
+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
99
|
+
end
|
100
|
+
|
83
101
|
response.status == 204
|
84
102
|
end
|
85
103
|
|
@@ -88,24 +106,41 @@ module Weaviate
|
|
88
106
|
class_name:,
|
89
107
|
id:,
|
90
108
|
properties:,
|
91
|
-
vector: nil
|
109
|
+
vector: nil,
|
110
|
+
consistency_level: nil
|
92
111
|
)
|
112
|
+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
113
|
+
|
93
114
|
response = client.connection.put("#{PATH}/#{class_name}/#{id}") do |req|
|
115
|
+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
116
|
+
|
94
117
|
req.body = {}
|
95
118
|
req.body["id"] = id
|
96
119
|
req.body["class"] = class_name
|
97
120
|
req.body["properties"] = properties
|
98
121
|
req.body["vector"] = vector unless vector.nil?
|
99
122
|
end
|
100
|
-
|
101
|
-
|
102
|
-
end
|
123
|
+
|
124
|
+
response.body
|
103
125
|
end
|
104
126
|
|
105
127
|
# Delete an individual data object from Weaviate.
|
106
|
-
def delete(
|
107
|
-
|
108
|
-
|
128
|
+
def delete(
|
129
|
+
class_name:,
|
130
|
+
id:,
|
131
|
+
consistency_level: nil
|
132
|
+
)
|
133
|
+
validate_consistency_level!(consistency_level) unless consistency_level.nil?
|
134
|
+
|
135
|
+
response = client.connection.delete("#{PATH}/#{class_name}/#{id}") do |req|
|
136
|
+
req.params["consistency_level"] = consistency_level.to_s.upcase unless consistency_level.nil?
|
137
|
+
end
|
138
|
+
|
139
|
+
if response.success?
|
140
|
+
response.body.empty?
|
141
|
+
else
|
142
|
+
response.body
|
143
|
+
end
|
109
144
|
end
|
110
145
|
|
111
146
|
def batch_delete(
|
@@ -116,7 +151,12 @@ module Weaviate
|
|
116
151
|
dry_run: nil
|
117
152
|
)
|
118
153
|
path = "batch/#{PATH}"
|
119
|
-
|
154
|
+
|
155
|
+
unless consistency_level.nil?
|
156
|
+
validate_consistency_level!(consistency_level)
|
157
|
+
|
158
|
+
path << "?consistency_level=#{consistency_level.to_s.upcase}"
|
159
|
+
end
|
120
160
|
|
121
161
|
response = client.connection.delete(path) do |req|
|
122
162
|
req.body = {
|
@@ -133,7 +173,31 @@ module Weaviate
|
|
133
173
|
end
|
134
174
|
|
135
175
|
# Validate a data object
|
136
|
-
|
137
|
-
|
176
|
+
def validate(
|
177
|
+
class_name:,
|
178
|
+
properties:,
|
179
|
+
id: nil
|
180
|
+
)
|
181
|
+
response = client.connection.post("#{PATH}/validate") do |req|
|
182
|
+
req.body = {}
|
183
|
+
req.body["class"] = class_name
|
184
|
+
req.body["properties"] = properties
|
185
|
+
req.body["id"] = id unless id.nil?
|
186
|
+
end
|
187
|
+
|
188
|
+
if response.success?
|
189
|
+
response.body.empty?
|
190
|
+
else
|
191
|
+
response.body
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
private
|
196
|
+
|
197
|
+
def validate_consistency_level!(consistency_level)
|
198
|
+
unless %w[ONE QUORUM ALL].include?(consistency_level.to_s.upcase)
|
199
|
+
raise ArgumentError, 'consistency_level must be either "ONE" or "QUORUM" OR "ALL"'
|
200
|
+
end
|
201
|
+
end
|
138
202
|
end
|
139
203
|
end
|
data/lib/weaviate/query.rb
CHANGED
@@ -12,7 +12,8 @@ module Weaviate
|
|
12
12
|
where: nil,
|
13
13
|
near_text: nil,
|
14
14
|
near_vector: nil,
|
15
|
-
near_object: nil
|
15
|
+
near_object: nil,
|
16
|
+
ask: nil
|
16
17
|
)
|
17
18
|
response = client.graphql.execute(
|
18
19
|
get_query(
|
@@ -22,13 +23,14 @@ module Weaviate
|
|
22
23
|
where: where,
|
23
24
|
near_text: near_text,
|
24
25
|
near_vector: near_vector,
|
25
|
-
near_object: near_object
|
26
|
+
near_object: near_object,
|
27
|
+
ask: ask
|
26
28
|
),
|
27
29
|
after: after,
|
28
30
|
limit: limit,
|
29
31
|
offset: offset
|
30
32
|
)
|
31
|
-
response.
|
33
|
+
response.original_hash.dig("data", "Get", class_name)
|
32
34
|
rescue Graphlient::Errors::ExecutionError => error
|
33
35
|
raise Weaviate::Error.new(error.response.data.get.errors.messages.to_h)
|
34
36
|
end
|
@@ -53,13 +55,68 @@ module Weaviate
|
|
53
55
|
group_by: group_by,
|
54
56
|
object_limit: object_limit
|
55
57
|
)
|
56
|
-
response.
|
58
|
+
response.original_hash.dig("data", "Aggregate", class_name)
|
57
59
|
rescue Graphlient::Errors::ExecutionError => error
|
58
60
|
raise Weaviate::Error.new(error.response.data.aggregate.errors.messages.to_h)
|
59
61
|
end
|
60
62
|
|
63
|
+
def explore(
|
64
|
+
fields:,
|
65
|
+
after: nil,
|
66
|
+
limit: nil,
|
67
|
+
offset: nil,
|
68
|
+
sort: nil,
|
69
|
+
where: nil,
|
70
|
+
near_text: nil,
|
71
|
+
near_vector: nil,
|
72
|
+
near_object: nil
|
73
|
+
)
|
74
|
+
response = client.graphql.execute(
|
75
|
+
explore_query(
|
76
|
+
fields: fields,
|
77
|
+
near_text: near_text,
|
78
|
+
near_vector: near_vector,
|
79
|
+
near_object: near_object
|
80
|
+
),
|
81
|
+
after: after,
|
82
|
+
limit: limit,
|
83
|
+
offset: offset
|
84
|
+
)
|
85
|
+
response.original_hash.dig("data", "Explore")
|
86
|
+
rescue Graphlient::Errors::ExecutionError => error
|
87
|
+
raise Weaviate::Error.new(error.to_s)
|
88
|
+
end
|
89
|
+
|
61
90
|
private
|
62
91
|
|
92
|
+
def explore_query(
|
93
|
+
fields:,
|
94
|
+
where: nil,
|
95
|
+
near_text: nil,
|
96
|
+
near_vector: nil,
|
97
|
+
near_object: nil,
|
98
|
+
sort: nil
|
99
|
+
)
|
100
|
+
client.graphql.parse <<~GRAPHQL
|
101
|
+
query(
|
102
|
+
$limit: Int,
|
103
|
+
$offset: Int
|
104
|
+
) {
|
105
|
+
Explore (
|
106
|
+
limit: $limit,
|
107
|
+
offset: $offset,
|
108
|
+
#{near_text.present? ? "nearText: #{near_text}" : ""},
|
109
|
+
#{near_vector.present? ? "nearVector: #{near_vector}" : ""},
|
110
|
+
#{near_object.present? ? "nearObject: #{near_object}" : ""}
|
111
|
+
#{where.present? ? "where: #{where}" : ""},
|
112
|
+
#{sort.present? ? "sort: #{sort}" : ""}
|
113
|
+
) {
|
114
|
+
#{fields}
|
115
|
+
}
|
116
|
+
}
|
117
|
+
GRAPHQL
|
118
|
+
end
|
119
|
+
|
63
120
|
def get_query(
|
64
121
|
class_name:,
|
65
122
|
fields:,
|
@@ -67,6 +124,7 @@ module Weaviate
|
|
67
124
|
near_text: nil,
|
68
125
|
near_vector: nil,
|
69
126
|
near_object: nil,
|
127
|
+
ask: nil,
|
70
128
|
sort: nil
|
71
129
|
)
|
72
130
|
client.graphql.parse <<~GRAPHQL
|
@@ -83,6 +141,7 @@ module Weaviate
|
|
83
141
|
#{near_text.present? ? "nearText: #{near_text}" : ""},
|
84
142
|
#{near_vector.present? ? "nearVector: #{near_vector}" : ""},
|
85
143
|
#{near_object.present? ? "nearObject: #{near_object}" : ""},
|
144
|
+
#{ask.present? ? "ask: #{ask}" : ""},
|
86
145
|
#{where.present? ? "where: #{where}" : ""},
|
87
146
|
#{sort.present? ? "sort: #{sort}" : ""}
|
88
147
|
) {
|
data/lib/weaviate/schema.rb
CHANGED
@@ -7,7 +7,7 @@ module Weaviate
|
|
7
7
|
# Dumps the current Weaviate schema. The result contains an array of objects.
|
8
8
|
def list
|
9
9
|
response = client.connection.get(PATH)
|
10
|
-
|
10
|
+
response.body
|
11
11
|
end
|
12
12
|
|
13
13
|
# Get a single class from the schema
|
@@ -15,15 +15,17 @@ module Weaviate
|
|
15
15
|
response = client.connection.get("#{PATH}/#{class_name}")
|
16
16
|
|
17
17
|
if response.success?
|
18
|
-
|
18
|
+
response.body
|
19
|
+
elsif response.status == 404
|
20
|
+
response.reason_phrase
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
24
|
# Create a new data object class in the schema.
|
23
25
|
def create(
|
24
26
|
class_name:,
|
25
|
-
description
|
26
|
-
properties
|
27
|
+
description: nil,
|
28
|
+
properties: nil,
|
27
29
|
vector_index_type: nil,
|
28
30
|
vector_index_config: nil,
|
29
31
|
vectorizer: nil,
|
@@ -33,7 +35,7 @@ module Weaviate
|
|
33
35
|
)
|
34
36
|
response = client.connection.post(PATH) do |req|
|
35
37
|
req.body = {}
|
36
|
-
req.body["class"] = class_name
|
38
|
+
req.body["class"] = class_name
|
37
39
|
req.body["description"] = description unless description.nil?
|
38
40
|
req.body["vectorIndexType"] = vector_index_type unless vector_index_type.nil?
|
39
41
|
req.body["vectorIndexConfig"] = vector_index_config unless vector_index_config.nil?
|
@@ -44,20 +46,24 @@ module Weaviate
|
|
44
46
|
req.body["replicationConfig"] = replication_config unless replication_config.nil?
|
45
47
|
end
|
46
48
|
|
47
|
-
|
48
|
-
Response::Class.new(response.body)
|
49
|
-
else
|
50
|
-
response.body
|
51
|
-
end
|
49
|
+
response.body
|
52
50
|
end
|
53
51
|
|
54
52
|
# Remove a class (and all data in the instances) from the schema.
|
55
53
|
def delete(class_name:)
|
56
54
|
response = client.connection.delete("#{PATH}/#{class_name}")
|
57
|
-
|
55
|
+
|
56
|
+
if response.success?
|
57
|
+
response.body.empty?
|
58
|
+
else
|
59
|
+
response.body
|
60
|
+
end
|
58
61
|
end
|
59
62
|
|
60
63
|
# Update settings of an existing schema class.
|
64
|
+
# TODO: Fix it.
|
65
|
+
# This endpoint keeps returning the following error:
|
66
|
+
# => {"error"=>[{"message"=>"properties cannot be updated through updating the class. Use the add property feature (e.g. \"POST /v1/schema/{className}/properties\") to add additional properties"}]}
|
61
67
|
def update(
|
62
68
|
class_name:,
|
63
69
|
description: nil,
|
@@ -83,10 +89,22 @@ module Weaviate
|
|
83
89
|
end
|
84
90
|
|
85
91
|
if response.success?
|
86
|
-
Response::Class.new(response.body)
|
87
|
-
else
|
88
|
-
response.body
|
89
92
|
end
|
93
|
+
response.body
|
94
|
+
end
|
95
|
+
|
96
|
+
# Add a property to an existing schema class.
|
97
|
+
def add_property(
|
98
|
+
class_name:,
|
99
|
+
property:
|
100
|
+
)
|
101
|
+
response = client.connection.post("#{PATH}/#{class_name}/properties") do |req|
|
102
|
+
req.body = property
|
103
|
+
end
|
104
|
+
|
105
|
+
if response.success?
|
106
|
+
end
|
107
|
+
response.body
|
90
108
|
end
|
91
109
|
|
92
110
|
# Inspect the shards of a class
|
data/lib/weaviate/version.rb
CHANGED
data/lib/weaviate.rb
CHANGED
@@ -15,11 +15,4 @@ module Weaviate
|
|
15
15
|
autoload :Health, "weaviate/health"
|
16
16
|
autoload :Classifications, "weaviate/classifications"
|
17
17
|
autoload :Backups, "weaviate/backups"
|
18
|
-
|
19
|
-
module Response
|
20
|
-
autoload :Base, "weaviate/response/base"
|
21
|
-
autoload :Object, "weaviate/response/object"
|
22
|
-
autoload :Class, "weaviate/response/class"
|
23
|
-
autoload :Collection, "weaviate/response/collection"
|
24
|
-
end
|
25
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weaviate-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrei Bondarev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-04-
|
11
|
+
date: 2023-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -79,10 +79,6 @@ files:
|
|
79
79
|
- lib/weaviate/objects.rb
|
80
80
|
- lib/weaviate/oidc.rb
|
81
81
|
- lib/weaviate/query.rb
|
82
|
-
- lib/weaviate/response/base.rb
|
83
|
-
- lib/weaviate/response/class.rb
|
84
|
-
- lib/weaviate/response/collection.rb
|
85
|
-
- lib/weaviate/response/object.rb
|
86
82
|
- lib/weaviate/schema.rb
|
87
83
|
- lib/weaviate/version.rb
|
88
84
|
- sig/weaviate.rbs
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "ostruct"
|
4
|
-
|
5
|
-
module Weaviate
|
6
|
-
module Response
|
7
|
-
class Base < OpenStruct
|
8
|
-
def initialize(attributes)
|
9
|
-
super to_ostruct(attributes)
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_ostruct(obj)
|
13
|
-
if obj.is_a?(Hash)
|
14
|
-
OpenStruct.new(obj.map { |key, val| [key, to_ostruct(val)] }.to_h)
|
15
|
-
elsif obj.is_a?(Array)
|
16
|
-
obj.map { |o| to_ostruct(o) }
|
17
|
-
else # Assumed to be a primitive value
|
18
|
-
obj
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Weaviate
|
4
|
-
module Response
|
5
|
-
class Collection
|
6
|
-
attr_reader :data, :total_results
|
7
|
-
|
8
|
-
def self.from_response(body, type:, key: nil)
|
9
|
-
new(
|
10
|
-
data: (key.nil? ? body : body[key]).map { |attrs| type.new(attrs) }
|
11
|
-
# TODO: Integrate and use the totalResults from the response.
|
12
|
-
# total_results: body["totalResults"]
|
13
|
-
)
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize(data:, total_results: nil)
|
17
|
-
@data = data
|
18
|
-
@total_results = total_results
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|