SQLite extension for graph queries using Cypher
Project description
GraphQLite Python
Python bindings for GraphQLite, a SQLite extension that adds graph database capabilities using Cypher.
Installation
pip install graphqlite
Quick Start
High-Level Graph API (Recommended)
The Graph class provides an ergonomic interface for common graph operations:
from graphqlite import Graph
# Create a graph (in-memory or file-based)
g = Graph(":memory:")
# Add nodes
g.upsert_node("alice", {"name": "Alice", "age": 30}, label="Person")
g.upsert_node("bob", {"name": "Bob", "age": 25}, label="Person")
# Add edges
g.upsert_edge("alice", "bob", {"since": 2020}, rel_type="KNOWS")
# Query
print(g.stats()) # {'nodes': 2, 'edges': 1}
print(g.get_neighbors("alice")) # [{'id': 'bob', ...}]
print(g.node_degree("alice")) # 1
# Graph algorithms
ranks = g.pagerank()
communities = g.community_detection()
# Raw Cypher when needed
results = g.query("MATCH (a)-[:KNOWS]->(b) RETURN a.name, b.name")
Low-Level Cypher API
For complex queries or when you need full control:
from graphqlite import connect
db = connect("graph.db")
db.cypher("CREATE (a:Person {name: 'Alice', age: 30})")
db.cypher("CREATE (b:Person {name: 'Bob', age: 25})")
db.cypher("""
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS]->(b)
""")
results = db.cypher("MATCH (a:Person)-[:KNOWS]->(b) RETURN a.name, b.name")
for row in results:
print(f"{row['a.name']} knows {row['b.name']}")
API Reference
Graph Class
from graphqlite import Graph, graph
# Constructor
g = Graph(db_path=":memory:", namespace="default", extension_path=None)
# Or use the factory function
g = graph(":memory:")
Node Operations
| Method | Description |
|---|---|
upsert_node(node_id, props, label="Entity") |
Create or update a node |
get_node(node_id) |
Get node by ID |
has_node(node_id) |
Check if node exists |
delete_node(node_id) |
Delete node and its edges |
get_all_nodes(label=None) |
Get all nodes, optionally by label |
Edge Operations
| Method | Description |
|---|---|
upsert_edge(source, target, props, rel_type="RELATED") |
Create edge between nodes |
get_edge(source, target) |
Get edge properties |
has_edge(source, target) |
Check if edge exists |
delete_edge(source, target) |
Delete edge |
get_all_edges() |
Get all edges |
Graph Queries
| Method | Description |
|---|---|
node_degree(node_id) |
Count edges connected to node |
get_neighbors(node_id) |
Get adjacent nodes |
get_node_edges(node_id) |
Get all edges for a node |
stats() |
Get node/edge counts |
query(cypher) |
Execute raw Cypher query |
Graph Algorithms
Centrality
| Method | Description |
|---|---|
pagerank(damping=0.85, iterations=20) |
PageRank importance scores |
degree_centrality() |
In/out/total degree for each node |
betweenness_centrality() |
Betweenness centrality scores |
closeness_centrality() |
Closeness centrality scores |
eigenvector_centrality(iterations=100) |
Eigenvector centrality scores |
Community Detection
| Method | Description |
|---|---|
community_detection(iterations=10) |
Label propagation communities |
louvain(resolution=1.0) |
Louvain modularity optimization |
leiden_communities(resolution, seed) |
Leiden algorithm (requires graspologic) |
Connected Components
| Method | Description |
|---|---|
weakly_connected_components() |
Weakly connected components |
strongly_connected_components() |
Strongly connected components |
Path Finding
| Method | Description |
|---|---|
shortest_path(source, target, weight) |
Dijkstra's shortest path |
astar(source, target, lat, lon) |
A* with optional heuristic |
all_pairs_shortest_path() |
All-pairs shortest paths (Floyd-Warshall) |
Traversal
| Method | Description |
|---|---|
bfs(start, max_depth=-1) |
Breadth-first search |
dfs(start, max_depth=-1) |
Depth-first search |
Similarity
| Method | Description |
|---|---|
node_similarity(n1, n2, threshold, top_k) |
Jaccard similarity |
knn(node, k=10) |
K-nearest neighbors |
triangle_count() |
Triangle counts and clustering coefficients |
Export
| Method | Description |
|---|---|
to_rustworkx() |
Export to rustworkx PyDiGraph (requires rustworkx) |
Batch Operations
# Batch insert nodes
g.upsert_nodes_batch([
("n1", {"name": "Alice"}, "Person"),
("n2", {"name": "Bob"}, "Person"),
])
# Batch insert edges
g.upsert_edges_batch([
("n1", "n2", {"weight": 1.0}, "KNOWS"),
])
Connection Class
from graphqlite import connect, wrap
# Open new connection
db = connect("graph.db")
db = connect(":memory:")
# Wrap existing sqlite3 connection
import sqlite3
conn = sqlite3.connect("graph.db")
db = wrap(conn)
Methods
| Method | Description |
|---|---|
cypher(query) |
Execute Cypher query, return results |
execute(sql) |
Execute raw SQL |
close() |
Close connection |
CypherResult
Results from cypher() calls:
results = db.cypher("MATCH (n) RETURN n.name")
len(results) # Number of rows
results[0] # First row as dict
results.columns # Column names
results.to_list() # All rows as list
for row in results:
print(row["n.name"])
Utility Functions
from graphqlite import escape_string, sanitize_rel_type, CYPHER_RESERVED
# Escape strings for Cypher queries
safe = escape_string("It's a test") # "It\\'s a test"
# Sanitize relationship types
rel = sanitize_rel_type("has-items") # "has_items"
rel = sanitize_rel_type("CREATE") # "REL_CREATE" (reserved word)
# Set of Cypher reserved keywords
if "MATCH" in CYPHER_RESERVED:
print("MATCH is reserved")
Extension Path
The extension is located automatically. To specify a custom path:
db = connect("graph.db", extension_path="/path/to/graphqlite.dylib")
Or set the GRAPHQLITE_EXTENSION_PATH environment variable.
Troubleshooting
See FAQ.md for common issues and solutions.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file graphqlite-0.2.1rc1.tar.gz.
File metadata
- Download URL: graphqlite-0.2.1rc1.tar.gz
- Upload date:
- Size: 247.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f459e761f07dc1538df4027d891a16dd5590d5f137a7a8816b8c1f4c73c2080b
|
|
| MD5 |
f223c341fa370a2b356ffb9db6e10a82
|
|
| BLAKE2b-256 |
70b9ab97087329a3234c3de0fda3417185d414970192ae88651e8dda4c5fba17
|
File details
Details for the file graphqlite-0.2.1rc1-py3-none-win_amd64.whl.
File metadata
- Download URL: graphqlite-0.2.1rc1-py3-none-win_amd64.whl
- Upload date:
- Size: 1.2 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ccb88e9aafd15f362e729071b16fe29946546f8fe7abb805516a65516301264
|
|
| MD5 |
f30c93ce15964d4fa66715b67cd7fc65
|
|
| BLAKE2b-256 |
9e30048242b1b5e5f962fbe6c2eb0e7119f78c647b947824c25a14059c74f324
|
File details
Details for the file graphqlite-0.2.1rc1-py3-none-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: graphqlite-0.2.1rc1-py3-none-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 198.2 kB
- Tags: Python 3, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a35f61816168f110e8ff783eea4b628ad64458a31224c392e6aed6995764e80a
|
|
| MD5 |
65bdb050cb7b7ace6f991bb2118afd6f
|
|
| BLAKE2b-256 |
28832254c9a6be3651dc7e34f8415632eeca57a92c07a092515dee23f2dc5a62
|
File details
Details for the file graphqlite-0.2.1rc1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: graphqlite-0.2.1rc1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 199.8 kB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
602a60896e0af1d5daab12187d29e31fc51cdd87322a7f78e64d15391789df78
|
|
| MD5 |
5edf744b24c3b0a7135ecd037fbb97c1
|
|
| BLAKE2b-256 |
ad19fda14287bc519edefeb652c516f301c3be19aaf0712a71b11e4efde4e9c7
|
File details
Details for the file graphqlite-0.2.1rc1-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: graphqlite-0.2.1rc1-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 154.1 kB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0fc82f99fd1c5fa85069a0895b70c1f2e309d91aa64e8ce43fa95ce444ce0fd7
|
|
| MD5 |
ed7231171b98e381e7385771f12dd5b1
|
|
| BLAKE2b-256 |
3a01375df44106a671d17c6601dd5ac2895fe2e7d3211883c6f5fa328035582c
|