GraphQL - Aggregate{}
You can try these queries on our demo instance (https://edu-demo.weaviate.network). You can authenticate against it with the read-only Weaviate API key learn-weaviate
, and run the query with your preferred Weaviate client.
We include client instantiation examples below:
edu-demo
client instantiation
- Python
- TypeScript
- Go
- Java
- Curl
import weaviate
# Instantiate the client with the auth config
client = weaviate.Client(
url="https://edu-demo.weaviate.network",
auth_client_secret=weaviate.AuthApiKey(api_key="learn-weaviate"),
additional_headers={
"X-OpenAI-Api-Key": "YOUR-OPENAI-API-KEY", # Only needed for `nearText` or `hybrid` queries
},
)
import weaviate, { WeaviateClient, ApiKey } from 'weaviate-ts-client';
// Instantiate the client with the auth config
const client: WeaviateClient = weaviate.client({
scheme: 'https',
host: 'edu-demo.weaviate.network',
apiKey: new ApiKey('learn-weaviate'),
headers: {
'X-OpenAI-Api-Key': 'YOUR-OPENAI-API-KEY', // Only needed for `nearText` or `hybrid` queries
},
});
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
)
// Instantiate the client with the auth config
cfg := weaviate.Config(
Host:"edu-demo.weaviate.network",
Scheme: "https",
AuthConfig: auth.ApiKey{Value: "learn-weaviate"},
Headers: map[string]string{
"X-OpenAI-Api-Key": "YOUR-OPENAI-API-KEY", // Only needed for `nearText` or `hybrid` queries
},
)
client, err := weaviate.NewClient(cfg)
if err != nil{
fmt.Println(err)
}
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateAuthClient;
Map<String, String> headers = new HashMap<String, String>() { {
put("X-OpenAI-Api-Key", "YOUR-OPENAI-API-KEY"); // Only needed for `nearText` or `hybrid` queries
} };
Config config = new Config("https", "edu-demo.weaviate.network", headers);
WeaviateClient client = WeaviateAuthClient.apiKey(config, "learn-weaviate");
Note: OpenAI API key only needed for nearText
or hybrid
queries
curl https://edu-demo.weaviate.network/v1/meta \
-H 'Content-Type: application/json' \
-H "X-OpenAI-Api-Key: YOUR-OPENAI-API-KEY" \
-H "Authorization: Bearer YOUR-WEAVIATE-API-KEY" | jq
Aggregate{} syntax and query structureโ
This example shows how to aggregate over the entire database. Below you will find examples of how to dynamically retrieve objects using a vector search and then aggregating only the matches. The Aggregate{}
function is structured as follows:
{
Aggregate {
<Class> (groupBy:[<property>]) {
groupedBy { # requires `groupBy` filter
path
value
}
meta {
count
}
<propertyOfDatatypeString> {
count
type
topOccurrences {
value
occurs
}
}
<propertyOfDatatypeText> {
count
type
topOccurrences {
value
occurs
}
}
<propertyOfDatatypeNumberOrInteger> {
count
type
minimum
maximum
mean
median
mode
sum
}
<propertyOfDatatypeBoolean> {
count
type
totalTrue
totalFalse
percentageTrue
percentageFalse
}
<propertyWithReference>
pointingTo
type
}
}
}
Below is an example query to obtain meta information about the data in the class Article
. Note that the data is not grouped yet, the meta information is about all the data objects found with the class Article
.
- Python
- JavaScript
- Go
- Java
- Curl
- GraphQL
import weaviate
client = weaviate.Client("http://localhost:8080")
response = (
client.query
.aggregate("Article")
.with_meta_count()
.with_fields("wordCount {count maximum mean median minimum mode sum type}")
.do()
)
print(response)
const weaviate = require('weaviate-client');
const client = weaviate.client({
scheme: 'http',
host: 'localhost:8080',
});
client.graphql
.aggregate()
.withClassName('Article')
.withFields('meta { count } wordCount {count maximum mean median minimum mode sum type}')
.do()
.then(res => {
console.log(res)
})
.catch(err => {
console.error(err)
});
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: "localhost:8080",
Scheme: "http",
}
client, err := weaviate.NewClient(cfg)
if err != nil {
panic(err)
}
title := graphql.Field{Name: "title"}
url := graphql.Field{Name: "url"}
wordCount := graphql.Field{
Name: "wordCount", Fields: []graphql.Field{
{Name: "mean"},
{Name: "maximum"},
{Name: "median"},
{Name: "minimum"},
{Name: "mode"},
{Name: "sum"},
{Name: "type"},
},
}
inPublication := graphql.Field{
Name: "inPublication", Fields: []graphql.Field{
{Name: "pointingTo"},
{Name: "count"},
},
}
result, err := client.GraphQL().Aggregate().
WithClassName("Article").
WithFields(title, url, wordCount, inPublication).
Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", result)
}
package io.weaviate;
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.fields.Field;
public class App {
public static void main(String[] args) {
Config config = new Config("http", "localhost:8080");
WeaviateClient client = new WeaviateClient(config);
Field meta = Field.builder()
.name("meta")
.fields(new Field[]{
Field.builder().name("count").build()
}).build();
Field wordCount = Field.builder()
.name("wordCount")
.fields(new Field[]{
Field.builder().name("mean").build(),
Field.builder().name("maximum").build(),
Field.builder().name("median").build(),
Field.builder().name("minimum").build(),
Field.builder().name("mode").build(),
Field.builder().name("sum").build(),
Field.builder().name("type").build()
}).build();
Field inPublication = Field.builder()
.name("inPublication")
.fields(new Field[]{
Field.builder().name("pointingTo").build(),
Field.builder().name("count").build()
}).build();
Result<GraphQLResponse> result = client.graphQL().aggregate()
.withClassName("Article")
.withFields(meta, wordCount, inPublication)
.run();
if (result.hasErrors()) {
System.out.println(result.getError());
return;
}
System.out.println(result.getResult());
}
}
$ echo '{
"query": "{
Aggregate {
Article {
meta {
count
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}"
}' | curl \
-X POST \
-H 'Content-Type: application/json' \
-d @- \
http://localhost:8080/v1/graphql
{
Aggregate {
Article {
meta {
count
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}
The above query will result in something like the following:
{
"data": {
"Aggregate": {
"Article": [
{
"inPublication": {
"pointingTo": [
"Publication"
],
"type": "cref"
},
"meta": {
"count": 4403
},
"wordCount": {
"count": 4403,
"maximum": 16852,
"mean": 966.0113558937088,
"median": 680,
"minimum": 109,
"mode": 575,
"sum": 4253348,
"type": "int"
}
}
]
}
}
}
meta { count }
will return the query object countAs such, this Aggregate
query will retrieve the total object count in a class.
- Python
- JavaScript
- Go
- Java
- Curl
- GraphQL
import weaviate
client = weaviate.Client("https://some-endpoint.weaviate.network")
client.query.aggregate(<ClassName>).with_meta_count().do()
const weaviate = require("weaviate-client");
const client = weaviate.client({
scheme: 'https',
host: 'some-endpoint.weaviate.network',
});
client.graphql
.aggregate()
.withClassName(<ClassName>)
.withFields('meta { count }')
.do()
.then(res => {
console.log(JSON.stringify(res, null, 2))
})
.catch(err => {
console.error(JSON.stringify(err, null, 2))
});
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: "some-endpoint.weaviate.network",
Scheme: "https",
}
client := weaviate.New(cfg)
meta := graphql.Field{
Name: "meta", Fields: []graphql.Field{
{Name: "count"},
},
}
result, err := client.GraphQL().Aggregate().
WithClassName("<ClassName>").
WithFields(meta).
Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", result)
}
package io.weaviate;
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.fields.Field;
public class App {
public static void main(String[] args) {
Config config = new Config("https", "some-endpoint.weaviate.network");
WeaviateClient client = new WeaviateClient(config);
Field meta = Field.builder()
.name("meta")
.fields(new Field[]{
Field.builder().name("count").build()
}).build();
Result<GraphQLResponse> result = client.graphQL().aggregate()
.withClassName(<ClassName>)
.withFields(meta)
.run();
if (result.hasErrors()) {
System.out.println(result.getError());
return;
}
System.out.println(result.getResult());
}
}
echo '{
"query": "{
Aggregate {
<ClassName> {
meta {
count
}
}
}
}"
}' | tr -d "\n" | curl \
-X POST \
-H 'Content-Type: application/json' \
-d @- \
https://some-endpoint.weaviate.network/v1/graphql
{ Aggregate { <ClassName> { meta { count } } } }
groupBy argumentโ
You can use a groupBy argument to get meta information about groups of data objects.
The groupBy{}
argument is structured as follows for the Aggregate{}
function:
{
Aggregate {
<Class> ( groupBy: ["<propertyName>"] ) {
groupedBy {
path
value
}
meta {
count
}
<propertyName> {
count
}
}
}
}
In the following example, the articles are grouped by the property inPublication
, referring to the article's publisher.
- Python
- JavaScript
- Go
- Java
- Curl
- GraphQL
import weaviate
client = weaviate.Client("http://localhost:8080")
response = (
client.query
.aggregate("Article")
.with_group_by_filter(["inPublication"])
.with_meta_count()
.with_fields("meta { count } wordCount { mean } groupedBy { path value }")
.do()
)
print(response)
// this query currently gives an inconsistent result from a plain graphql query, see https://github.com/weaviate/weaviate-javascript-client/issues/8
const weaviate = require('weaviate-client');
const client = weaviate.client({
scheme: 'http',
host: 'localhost:8080',
});
client.graphql
.aggregate()
.withClassName('Article')
.withGroupBy(['inPublication'])
.withFields('meta { count } wordCount {mean} groupedBy {value path}')
.do()
.then(res => {
console.log(res)
})
.catch(err => {
console.error(err)
});
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: "localhost:8080",
Scheme: "http",
}
client, err := weaviate.NewClient(cfg)
if err != nil {
panic(err)
}
meta := graphql.Field{
Name: "meta", Fields: []graphql.Field{
{Name: "count"},
},
}
wordCount := graphql.Field{
Name: "wordCount", Fields: []graphql.Field{
{Name: "mean"},
},
}
groupedBy := graphql.Field{
Name: "groupedBy", Fields: []graphql.Field{
{Name: "value"},
{Name: "path"},
},
}
result, err := client.GraphQL().Aggregate().
WithFields(meta, wordCount, groupedBy).
WithClassName("Article").
WithGroupBy("inPublication").
Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", result)
}
package io.weaviate;
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.fields.Field;
public class App {
public static void main(String[] args) {
Config config = new Config("http", "localhost:8080");
WeaviateClient client = new WeaviateClient(config);
Field meta = Field.builder()
.name("meta")
.fields(new Field[]{
Field.builder().name("count").build()
}).build();
Field wordCount = Field.builder()
.name("wordCount")
.fields(new Field[]{
Field.builder().name("mean").build()
}).build();
Field groupedBy = Field.builder()
.name("groupedBy")
.fields(new Field[]{
Field.builder().name("value").build(),
Field.builder().name("path").build()
}).build();
Result<GraphQLResponse> result = client.graphQL().aggregate()
.withClassName("Article")
.withFields(meta, wordCount, groupedBy)
.withGroupBy("inPublication")
.run();
if (result.hasErrors()) {
System.out.println(result.getError());
return;
}
System.out.println(result.getResult());
}
}
$ echo '{
"query": "{
Aggregate {
Article(groupBy: [\"inPublication\"]) {
meta {
count
}
wordCount {
mean
}
groupedBy {
value
path
}
}
}
}"
}' | curl \
-X POST \
-H 'Content-Type: application/json' \
-d @- \
http://localhost:8080/v1/graphql
{
Aggregate {
Article (groupBy:["inPublication"]) {
meta {
count
}
wordCount {
mean
}
groupedBy {
value
path
}
}
}
}
Expected response
{
"data": {
"Aggregate": {
"Article": [
{
"groupedBy": {
"path": [
"inPublication"
],
"value": "weaviate://localhost/Publication/16476dca-59ce-395e-b896-050080120cd4"
},
"meta": {
"count": 829
},
"wordCount": {
"mean": 604.6537997587454
}
},
{
"groupedBy": {
"path": [
"inPublication"
],
"value": "weaviate://localhost/Publication/c9a0e53b-93fe-38df-a6ea-4c8ff4501783"
},
"meta": {
"count": 618
},
"wordCount": {
"mean": 917.1860841423949
}
},
...
]
}
}
}
Additional filtersโ
Aggregate{}
functions can be extended with search filters. Because the filters work on multiple core functions (like Get{}
) there is a specific documentation page dedicated to filters.
Aggregating a Vector Search / Faceted Vector Searchโ
This feature was added in v1.13.0
You can combine a vector search (e.g. nearObject
, nearVector
, nearText
, nearImage
, etc.) with an aggregation. Internally, this is a two-step process where the vector search first finds the desired objects, then the results are aggregated.
Limiting the search spaceโ
Vector searches are different from keyword-based searches in the sense that they do not filter the result set, they just return the objects in a different order. Imagine having 1,000 objects and a vector search for "apple iphone"
. If there was no explicit limit, every single object in the database would be a potential match. Some matches would have a very high score (certainty), and the last matches would most likely have a very low score. But nevertheless all 1,000 objects could potentially be scored. The value in this search is in the order. If we only look at the top 10 results, they will be very closely related to the query vector. Similarly, the last 10 objects on the list would be very unrelated. However, the order is not visible within an aggregation.
As a result, whenever the goal is to aggregate vector search results, there needs to be something that limits the search space. Otherwise the Aggregation results (over all matches) will look exactly like an Aggregation without any additional near<Media>
parameter.
You can achieve such a restriction of the search space in two different ways:
Set an explicit
objectLimit
, e.g.objectLimit: 100
. This tells Weaviate to retrieve the top 100 objects related to your vector search query, then aggregate them. This is useful when you know up front how many results you want to serve, for example in a recommendation scenario, where you want to produce 100 recommendations.Set an explicit
certainty
, e.g.certainty: 0.7
. This tells Weaviate to retrieve all possible matches that have a certainty of 0.7 or higher. This list has no fixed length, it depends on how many objects were good matches. This is useful in user-facing search scenarios, such as e-commerce. The user might be interested in all search results semantically similar to "apple iphone" and then generate facets.
If neither an objectLimit
, nor a certainty
is set the query will error.
APIโ
Below are examples for nearObject
, nearVector
, and nearText
.
Any near<Media>
will work.
nearObjectโ
- Python
- JavaScript
- Go
- Java
- Curl
- GraphQL
import weaviate
client = weaviate.Client("http://localhost:8080")
result = (
client.query
.aggregate("Article")
.with_meta_count()
.with_fields("wordCount { count maximum mean median minimum mode sum type } inPublication { pointingTo type }")
# prior to v1.14, use certainty instead of distance
.with_near_object({"id": "00037775-1432-35e5-bc59-443baaef7d80", "distance": 0.6})
.with_object_limit(200)
.do()
)
print(result)
const weaviate = require('weaviate-client');
const client = weaviate.client({
scheme: 'http',
host: 'localhost:8080',
});
client.graphql
.aggregate()
.withClassName('Article')
.withFields('meta { count } wordCount { count maximum mean median minimum mode sum type } inPublication { pointingTo type }')
// prior to v1.14, use certainty instead of distance
.withNearObject({ id: '00037775-1432-35e5-bc59-443baaef7d80', distance: 0.6 })
.withObjectLimit(100)
.do()
.then(res => {
console.log(res)
})
.catch(err => {
console.error(err)
});
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: "localhost:8080",
Scheme: "http",
}
client, err := weaviate.NewClient(cfg)
if err != nil {
panic(err)
}
title := graphql.Field{Name: "title"}
url := graphql.Field{Name: "url"}
wordCount := graphql.Field{
Name: "wordCount", Fields: []graphql.Field{
{Name: "mean"},
{Name: "maximum"},
{Name: "median"},
{Name: "minimum"},
{Name: "mode"},
{Name: "sum"},
{Name: "type"},
},
}
inPublication := graphql.Field{
Name: "inPublication", Fields: []graphql.Field{
{Name: "pointingTo"},
{Name: "count"},
},
}
// nearObject
withNearObject := client.GraphQL().NearObjectArgBuilder().
WithDistance(0.85). // At least one of distance or objectLimit need to be set
WithID("00037775-1432-35e5-bc59-443baaef7d80")
result, err := client.GraphQL().
Aggregate().
WithFields(title, url, wordCount, inPublication).
WithNearObject(nearObject).
WithClassName("Article").
WithObjectLimit(100). // At least one of certainty or objectLimit need to be set
Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", result)
}
package io.weaviate;
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.argument.NearObjectArgument;
import io.weaviate.client.v1.graphql.query.fields.Field;
public class App {
public static void main(String[] args) {
Config config = new Config("http", "localhost:8080");
WeaviateClient client = new WeaviateClient(config);
Field meta = Field.builder()
.name("meta")
.fields(new Field[]{
Field.builder().name("count").build()
}).build();
Field wordCount = Field.builder()
.name("wordCount")
.fields(new Field[]{
Field.builder().name("mean").build(),
Field.builder().name("maximum").build(),
Field.builder().name("median").build(),
Field.builder().name("minimum").build(),
Field.builder().name("mode").build(),
Field.builder().name("sum").build(),
Field.builder().name("type").build()
}).build();
Field inPublication = Field.builder()
.name("inPublication")
.fields(new Field[]{
Field.builder().name("pointingTo").build(),
Field.builder().name("count").build()
}).build();
NearObjectArgument nearObject = NearObjectArgument.builder()
// prior to v1.14 use certainty instead of distance
.distance(0.6f) // at least one of certainty or objectLimit need to be set
.id("00037775-1432-35e5-bc59-443baaef7d80")
.build();
Result<GraphQLResponse> result = client.graphQL().aggregate()
.withClassName("Article")
.withFields(meta, wordCount, inPublication)
.withNearObject(nearObject)
.withObjectLimit(100) // at least one of certainty or objectLimit need to be set
.run();
if (result.hasErrors()) {
System.out.println(result.getError());
return;
}
System.out.println(result.getResult());
}
}
echo '{
"query": "{
Aggregate {
Article(nearObject:{
id: \"00037775-1432-35e5-bc59-443baaef7d80\"
distance: 0.6
},
objectLimit: 200) {
meta {
count
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}"
}' | curl \
-X POST \
-H 'Content-Type: application/json' \
-d @- \
http://localhost:8080/v1/graphql
{
Aggregate {
Article(
nearObject: {
id: "00037775-1432-35e5-bc59-443baaef7d80"
# prior to v1.14, use `certainty` instead of `distance`
distance: 0.6
},
# at least one of "objectLimit" and/or "distance" must be set when using near<Media>
objectLimit: 200
) {
meta {
count
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}
nearVectorโ
To run this query, replace the placeholder vector with a real vector from the same vectorizer that used to generate object vectors.
- Python
- JavaScript
- Go
- Java
- Curl
- GraphQL
import weaviate
client = weaviate.Client("http://localhost:8080")
result = (
client.query
.aggregate("Article")
.with_meta_count()
.with_fields("wordCount {count maximum mean median minimum mode sum type}")
.with_near_vector({"vector": [0.1, 0.2, -0.3], "certainty": 0.7})
.with_object_limit(100)
.do()
)
print(result)
const weaviate = require('weaviate-client');
const client = weaviate.client({
scheme: 'http',
host: 'localhost:8080',
});
client.graphql
.aggregate()
.withClassName('Article')
.withFields('meta { count } wordCount {count maximum mean median minimum mode sum type}')
.withNearVector({ vector: [0.1, 0.2, -0.3], certainty: 0.7 })
.withObjectLimit(100)
.do()
.then(res => {
console.log(res)
})
.catch(err => {
console.error(err)
});
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: "localhost:8080",
Scheme: "http",
}
client, err := weaviate.NewClient(cfg)
if err != nil {
panic(err)
}
title := graphql.Field{Name: "title"}
url := graphql.Field{Name: "url"}
wordCount := graphql.Field{
Name: "wordCount", Fields: []graphql.Field{
{Name: "mean"},
{Name: "maximum"},
{Name: "median"},
{Name: "minimum"},
{Name: "mode"},
{Name: "sum"},
{Name: "type"},
},
}
inPublication := graphql.Field{
Name: "inPublication", Fields: []graphql.Field{
{Name: "pointingTo"},
{Name: "count"},
},
}
// nearVector
nearVector := &graphql.NearVectorArgumentBuilder{}
nearVector.WithCertainty(0.85). // At least one of certainty or objectLimit need to be set
WithVector([]float32{0.1, 0.2, -0.3})
result, err := client.GraphQL().
Aggregate().
WithFields(title, url, wordCount, inPublication).
WithNearVector(nearVector).
WithClassName("Article").
WithObjectLimit(100). // At least one of certainty or objectLimit need to be set
Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", result)
}
package io.weaviate;
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.argument.NearVectorArgument;
import io.weaviate.client.v1.graphql.query.fields.Field;
public class App {
public static void main(String[] args) {
Config config = new Config("http", "localhost:8080");
WeaviateClient client = new WeaviateClient(config);
Field meta = Field.builder()
.name("meta")
.fields(new Field[]{
Field.builder().name("count").build()
}).build();
Field wordCount = Field.builder()
.name("wordCount")
.fields(new Field[]{
Field.builder().name("mean").build(),
Field.builder().name("maximum").build(),
Field.builder().name("median").build(),
Field.builder().name("minimum").build(),
Field.builder().name("mode").build(),
Field.builder().name("sum").build(),
Field.builder().name("type").build()
}).build();
Field inPublication = Field.builder()
.name("inPublication")
.fields(new Field[]{
Field.builder().name("pointingTo").build(),
Field.builder().name("count").build()
}).build();
Float[] vector = new Float[]{ 1.0f, 2.0f, -3.0f };
NearVectorArgument nearVector = NearVectorArgument.builder()
.certainty(0.7f) // at least one of certainty or objectLimit need to be set
.vector(vector)
.build();
Result<GraphQLResponse> result = client.graphQL().aggregate()
.withClassName("Article")
.withFields(meta, wordCount, inPublication)
.withNearVector(nearVector)
.withObjectLimit(100) // at least one of certainty or objectLimit need to be set
.run();
if (result.hasErrors()) {
System.out.println(result.getError());
return;
}
System.out.println(result.getResult());
}
}
$ echo '{
"query": "{
Aggregate {
Article(nearVector:{
vector: [0.1, 0.2, -0.3]
certainty: 0.7
},
objectLimit: 200) {
meta {
count
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}"
}' | curl \
-X POST \
-H 'Content-Type: application/json' \
-d @- \
http://localhost:8080/v1/graphql
{
Aggregate {
Article(nearVector:{
vector: [0.1, 0.2, -0.3]
certainty: 0.7 # at least one of "objectLimit",
}, # and/or "certainty" must be set
objectLimit: 200) { # when using near<Media>
meta {
count
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}
nearTextโ
For nearText
to be available, a text2vec-*
module must be installed with Weaviate.
- Python
- JavaScript
- Go
- Java
- Curl
- GraphQL
import weaviate
client = weaviate.Client("http://localhost:8080")
result = (
client.query
.aggregate("Article")
.with_meta_count()
.with_fields("wordCount {count maximum mean median minimum mode sum type} inPublication {pointingTo type}")
.with_near_text({"concepts": ["apple iphone"], "distance": 0.7}) # prior to v1.14 use "certainty" instead of "distance"
.with_object_limit(200) # at least one of "objectLimit",
.do() # and/or "distance" must be set
) # when using near media filters
print(result)
const weaviate = require('weaviate-client');
const client = weaviate.client({
scheme: 'http',
host: 'localhost:8080',
});
client.graphql
.aggregate()
.withClassName('Article')
.withFields('meta { count } wordCount {count maximum mean median minimum mode sum type}')
.withNearText({ concepts: ['apple iphone'], distance: 0.7 }) // prior to v1.14 use "certainty"
.withObjectLimit(100) // instead of "distance".`
.do() // at least one of "objectLimit",
.then(res => { // and/or "distance" must be set
console.log(res) // when using near media filters
})
.catch(err => {
console.error(err)
});
package main
import (
"context"
"fmt"
"github.com/weaviate/weaviate-go-client/v4/weaviate"
"github.com/weaviate/weaviate-go-client/v4/weaviate/graphql"
)
func main() {
cfg := weaviate.Config{
Host: "localhost:8080",
Scheme: "http",
}
client, err := weaviate.NewClient(cfg)
if err != nil {
panic(err)
}
title := graphql.Field{Name: "title"}
url := graphql.Field{Name: "url"}
wordCount := graphql.Field{
Name: "wordCount", Fields: []graphql.Field{
{Name: "mean"},
{Name: "maximum"},
{Name: "median"},
{Name: "minimum"},
{Name: "mode"},
{Name: "sum"},
{Name: "type"},
},
}
inPublication := graphql.Field{
Name: "inPublication", Fields: []graphql.Field{
{Name: "pointingTo"},
{Name: "count"},
},
}
// nearText
nearText := &graphql.NearTextArgumentBuilder{}
nearText.WithDistance(0.85). // prior to v1.14 use WithCertainty()
WithConcepts([]string{"apple iphone"})
result, err := client.GraphQL().
Aggregate().
WithFields(title, url, wordCount, inPublication).
WithNearText(nearText).
WithClassName("Article").
WithObjectLimit(100). // at least one of distance or objectLimit need to be set
Do(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("%v", result)
}
package io.weaviate;
import io.weaviate.client.Config;
import io.weaviate.client.WeaviateClient;
import io.weaviate.client.base.Result;
import io.weaviate.client.v1.graphql.model.GraphQLResponse;
import io.weaviate.client.v1.graphql.query.argument.NearTextArgument;
import io.weaviate.client.v1.graphql.query.fields.Field;
public class App {
public static void main(String[] args) {
Config config = new Config("http", "localhost:8080");
WeaviateClient client = new WeaviateClient(config);
Field meta = Field.builder()
.name("meta")
.fields(new Field[]{
Field.builder().name("count").build()
}).build();
Field wordCount = Field.builder()
.name("wordCount")
.fields(new Field[]{
Field.builder().name("mean").build(),
Field.builder().name("maximum").build(),
Field.builder().name("median").build(),
Field.builder().name("minimum").build(),
Field.builder().name("mode").build(),
Field.builder().name("sum").build(),
Field.builder().name("type").build()
}).build();
Field inPublication = Field.builder()
.name("inPublication")
.fields(new Field[]{
Field.builder().name("pointingTo").build(),
Field.builder().name("count").build()
}).build();
NearTextArgument nearText = NearTextArgument.builder()
.distance(0.7f) // prior to v1.14 use .certainty()
.concepts(new String[]{ "pizza" })
.build();
Result<GraphQLResponse> result = client.graphQL().aggregate()
.withClassName("Article")
.withFields(meta, wordCount, inPublication)
.withNearText(nearText)
.withObjectLimit(100) // at least one of distance or objectLimit need to be set
.run();
if (result.hasErrors()) {
System.out.println(result.getError());
return;
}
System.out.println(result.getResult());
}
}
$ echo '{
"query": "{
Aggregate {
Article(nearText:{
concepts: ["apple iphone"]
distance: 0.7 // prior to v1.14 use "certainty"
},
objectLimit: 200) {
meta {
count
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}"
}' | curl \
-X POST \
-H 'Content-Type: application/json' \
-d @- \
http://localhost:8080/v1/graphql
{
Aggregate {
Article(nearText:{
concepts: ["apple iphone"]
distance: 0.7 # prior to v1.14 use "certainty" instead of "distance"
},
objectLimit: 200) { # at least one of "objectLimit",
meta { # and/or "distance" must be set
count # when using near media filters
}
inPublication {
pointingTo
type
}
wordCount {
count
maximum
mean
median
minimum
mode
sum
type
}
}
}
}
More Resourcesโ
If you can't find the answer to your question here, please look at the:
- Frequently Asked Questions. Or,
- Knowledge base of old issues. Or,
- For questions: Stackoverflow. Or,
- For more involved discussion: Weaviate Community Forum. Or,
- We also have a Slack channel.