Programmatic Usage
Programmatic Usage
QQL can be used as a Python library without the CLI.
run_query() — high-level API
from qql import run_query
# Insert a document (dense-only)
result = run_query(
"INSERT INTO COLLECTION notes VALUES {'text': 'hello world', 'author': 'alice', 'year': 2024}",
url="http://localhost:6333",
)
print(result.message) # "Inserted 1 point [<id>]"
print(result.data) # {"id": 1001 or "<uuid>", "collection": "notes"}
# Insert with hybrid vectors
result = run_query(
"INSERT INTO COLLECTION notes VALUES {'text': 'hello world'} USING HYBRID",
url="http://localhost:6333",
)
print(result.message) # "Inserted 1 point [<id>] (hybrid)"
# Dense search with WHERE filter
result = run_query(
"SEARCH notes SIMILAR TO 'hello' LIMIT 5 WHERE year >= 2023 AND author != 'bot'",
url="http://localhost:6333",
)
for hit in result.data:
print(hit["score"], hit["payload"])
# Hybrid search with WHERE filter
result = run_query(
"SEARCH notes SIMILAR TO 'hello' LIMIT 5 USING HYBRID WHERE year >= 2023",
url="http://localhost:6333",
)
for hit in result.data:
print(hit["score"], hit["payload"])
# Scroll / pagination
result = run_query(
"SCROLL FROM notes LIMIT 2",
url="http://localhost:6333",
)
for point in result.data["points"]:
print(point["id"], point["payload"])
print(result.data["next_offset"])
# Bulk insert (all records embedded and upserted in one call)
result = run_query(
"""INSERT BULK INTO COLLECTION notes VALUES [
{'id': 1, 'text': 'first document', 'year': 2023},
{'id': 2, 'text': 'second document', 'year': 2024}
]""",
url="http://localhost:6333",
)
print(result.message) # "Inserted 2 points"
# Recommend similar points using known IDs as positive examples
result = run_query(
"RECOMMEND FROM notes POSITIVE IDS (1, 2) NEGATIVE IDS (3) LIMIT 5",
url="http://localhost:6333",
)
for hit in result.data:
print(hit["score"], hit["payload"])
# Retrieve a point by ID
result = run_query(
"SELECT * FROM notes WHERE id = 1",
url="http://localhost:6333",
)
print(result.data) # {"id": "1", "payload": {...}}
# Delete by filter
result = run_query(
"DELETE FROM notes WHERE year < 2023",
url="http://localhost:6333",
)
print(result.message) # "Deleted N point(s)"
# Inspect collection diagnostics
result = run_query(
"SHOW COLLECTION notes",
url="http://localhost:6333",
)
print(result.data["topology"]) # "dense" or "hybrid"
print(result.data["vectors"]) # {"": {...}} or {"dense": {...}, ...}
print(result.data["payload_schema"]) # {"field": "keyword", ...} or None
Low-level pipeline API
For more control, use the pipeline directly:
from qdrant_client import QdrantClient
from qql.lexer import Lexer
from qql.parser import Parser
from qql.executor import Executor
from qql.config import QQLConfig
client = QdrantClient(url="http://localhost:6333")
config = QQLConfig(url="http://localhost:6333")
executor = Executor(client, config)
query = "SEARCH articles SIMILAR TO 'deep learning' LIMIT 10 USING HYBRID WHERE category = 'cv'"
tokens = Lexer().tokenize(query)
node = Parser(tokens).parse()
result = executor.execute(node)
for hit in result.data:
print(hit["score"], hit["payload"])
ExecutionResult
All operations return an ExecutionResult:
@dataclass
class ExecutionResult:
success: bool # True if operation succeeded
message: str # Human-readable summary
data: Any # Operation-specific payload (see below)
| Operation | result.data type |
|---|---|
| INSERT (dense) | {"id": int \| "<uuid>", "collection": "<name>"} |
| INSERT (hybrid) | {"id": int \| "<uuid>", "collection": "<name>"} |
| INSERT BULK | None (count in result.message) |
| SELECT | {"id": str, "payload": dict} or None when not found |
| SEARCH | [{"id": str, "score": float, "payload": dict}, ...] |
| SCROLL | {"points": [{"id": str, "payload": dict}, ...], "next_offset": str \| None} |
| RECOMMEND | [{"id": str, "score": float, "payload": dict}, ...] |
| SHOW COLLECTIONS | ["name1", "name2", ...] |
| SHOW COLLECTION | {"name": str, "status": str, "points_count": int \| None, "indexed_vectors_count": int \| None, "segments_count": int, "topology": str, "vectors": dict, "sparse_vectors": dict \| None, "quantization": str \| None, "hnsw_config": dict, "payload_schema": dict \| None, "sharding": dict} |
| CREATE COLLECTION | None |
| CREATE INDEX | None |
| DROP COLLECTION | None |
| DELETE | None |