Skip to main content

coordinode

PyPI Python License CI

Python gRPC client for CoordiNode — the graph-native hybrid retrieval engine for AI and GraphRAG.

Installation

pip install coordinode
uv add coordinode

Requirements

  • Python 3.11+
  • Running CoordiNode instance (docker compose up -d or binary)

Quick Start

from coordinode import CoordinodeClient

# Synchronous client — context manager handles connection lifecycle
with CoordinodeClient("localhost:7080") as db:
    # Cypher query — returns List[Dict[str, Any]]
    result = db.cypher("RETURN 1 AS n")
    print(result)  # [{'n': 1}]

    # With parameters
    rows = db.cypher(
        "MATCH (n:Person {name: $name}) RETURN n.age AS age",
        params={"name": "Alice"},
    )

    # Create nodes
    db.cypher(
        "CREATE (n:Document {title: $title, embedding: $vec})",
        params={"title": "RAG intro", "vec": [0.1, 0.2, 0.3, 0.4]},
    )

    # Health check
    assert db.health()

Async Client

import asyncio
from coordinode import AsyncCoordinodeClient


async def main():
    async with AsyncCoordinodeClient("localhost:7080") as db:
        rows = await db.cypher("MATCH (n:Concept) RETURN n.name AS name LIMIT 5")
        for row in rows:
            print(row["name"])


asyncio.run(main())

Connection Options

# host:port string
client = CoordinodeClient("localhost:7080")

# Separate host and port
client = CoordinodeClient("localhost", port=7080)

# TLS
client = CoordinodeClient("db.example.com:7443", tls=True)

# Custom timeout (seconds)
client = CoordinodeClient("localhost:7080", timeout=60.0)

Type Mapping

CoordiNode properties map to Python types automatically:

Python type CoordiNode type
int int_value
float float_value
str string_value
bool bool_value
bytes bytes_value
list[float] Vector (HNSW-indexable)
list[Any] PropertyList
dict[str, Any] PropertyMap
None unset (null semantics)

Vector Search

# Store a node with a vector embedding
db.cypher(
    "CREATE (d:Doc {title: $title, embedding: $vec})",
    params={"title": "RAG intro", "vec": [0.1] * 384},
)

# Nearest-neighbour search
results = db.vector_search(
    label="Doc",
    property="embedding",
    vector=[0.1] * 384,
    top_k=10,
    metric="cosine",  # "cosine" | "l2" | "dot" | "l1"
)
for r in results:
    print(r.node.id, r.distance)

Hybrid Search (v0.4+)

Fuse BM25 full-text and vector similarity using Cypher scoring functions:

# Full-text scoring (text_score / text_match) requires a TEXT INDEX on the
# queried property — without it those calls return zero/no matches.
db.create_text_index("idx_doc_body", "Doc", "body")

# Reciprocal Rank Fusion of text + vector. Projecting `d AS doc_id` returns the
# internal node id (an integer) — fetch properties explicitly when needed.
rows = db.cypher(
    """
    MATCH (d:Doc)
    WHERE text_match(d, $q) OR d.embedding IS NOT NULL
    RETURN d AS doc_id,
           d.title AS title,
           rrf_score(
               text_score(d, $q),
               vec_score(d.embedding, $vec)
           ) AS score
    ORDER BY score DESC LIMIT 10
""",
    params={"q": "graph neural network", "vec": [0.1] * 384},
)
# Full node properties: db.get_node(rows[0]["doc_id"]).

Helpers available in Cypher (evaluated server-side in coordinode-rs ≥ v0.4.0): text_score, vec_score, doc_score, text_match, rrf_score, hybrid_score. These are built-in Cypher functions; nothing to import on the Python side.

ATTACH / DETACH DOCUMENT (v0.4+)

Promote a nested property to a graph node (and back):

db.cypher("MATCH (a:Article {id: $id}) DETACH DOCUMENT a.body AS (d:Body)", params={"id": 1})
db.cypher("MATCH (a:Article {id: $id})-[:HAS_BODY]->(d:Body) ATTACH DOCUMENT d INTO a.body", params={"id": 1})

Consistency Controls

# Majority read for strict freshness. `n AS node_id` returns the integer id;
# use get_node(id) or project explicit properties (e.g. n.email AS email).
db.cypher(
    "MATCH (n:Account) RETURN n AS node_id, n.email AS email",
    read_concern="majority",
)

# Durable write, acknowledged by a majority of the cluster
db.cypher("CREATE (n:Event {t: timestamp()})", write_concern="majority")

# Causal read: see at least the state at raft index 42. The fence is about
# which replica may answer, so it is the READ concern that has to be majority.
db.cypher(
    "MATCH (n) RETURN count(n) AS total",
    after_index=42,
    read_concern="majority",
)

Accepted values:

  • read_concern: local (default) · majority · linearizable · snapshot. Causal reads (after_index > 0) require majority here.
  • write_concern: w0 · memory · cache · w1 (default) · majority
  • read_preference: primary (default) · primary_preferred · secondary · secondary_preferred · nearest

Related Packages

Package Description
langchain-coordinode LangChain GraphStore + GraphCypherQAChain
llama-index-graph-stores-coordinode LlamaIndex PropertyGraphStore

Links

Support

USDT TRC-20

USDT (TRC-20), maintainer's personal wallet: TFDsezHa1cBkoeZT5q2T49Wp66K8t2DmdA

License

Apache-2.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

coordinode-2.1.1.tar.gz (78.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

coordinode-2.1.1-py3-none-any.whl (121.4 kB view details)

Uploaded Python 3

File details

Details for the file coordinode-2.1.1.tar.gz.

File metadata

  • Download URL: coordinode-2.1.1.tar.gz
  • Upload date:
  • Size: 78.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for coordinode-2.1.1.tar.gz
Algorithm Hash digest
SHA256 536a8065e44e8097cbdc9b45f38bad2db51f19ff769953d54e2e86c24cf2f0c3
MD5 4ba95576ad6586b6190365aa2ebf4b6a
BLAKE2b-256 c990a032b45c6101bd6bc600b7c84e63ea14d57fbe0269465780f6709c16855f

See more details on using hashes here.

Provenance

The following attestation bundles were made for coordinode-2.1.1.tar.gz:

Publisher: release.yml on structured-world/coordinode-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file coordinode-2.1.1-py3-none-any.whl.

File metadata

  • Download URL: coordinode-2.1.1-py3-none-any.whl
  • Upload date:
  • Size: 121.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for coordinode-2.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fa4bb8c47f47de5f7be42498000d8586a5bddb35a76126db4836b4af4812e174
MD5 05eabee919b5b30a3dffa5515d8c3d8d
BLAKE2b-256 578867ffe06157c51df19f4f0f3ff172b377a073187ee0fc5ac765033af392fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for coordinode-2.1.1-py3-none-any.whl:

Publisher: release.yml on structured-world/coordinode-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

2.1.1 This release

2 files

1.0.6

2 files

1.0.5

2 files

0.6.0

2 files

0.5.0

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page