| Crates.io | ruvector-graph-wasm |
| lib.rs | ruvector-graph-wasm |
| version | 0.1.29 |
| created_at | 2025-11-26 17:47:16.594878+00 |
| updated_at | 2025-12-29 19:18:52.487548+00 |
| description | WebAssembly bindings for RuVector graph database with Neo4j-inspired API and Cypher support |
| homepage | |
| repository | https://github.com/ruvnet/ruvector |
| max_upload_size | |
| id | 1951924 |
| size | 83,975 |
WebAssembly bindings for RuVector graph database with Neo4j-inspired API and Cypher support.
npm install @ruvector/graph-wasm
import init, { GraphDB } from '@ruvector/graph-wasm';
await init();
// Create database
const db = new GraphDB('cosine');
// Create nodes
const aliceId = db.createNode(
['Person'],
{ name: 'Alice', age: 30 }
);
const bobId = db.createNode(
['Person'],
{ name: 'Bob', age: 35 }
);
// Create relationship
const friendshipId = db.createEdge(
aliceId,
bobId,
'KNOWS',
{ since: 2020 }
);
// Query (basic Cypher support)
const results = await db.query('MATCH (n:Person) RETURN n');
// Get statistics
const stats = db.stats();
console.log(`Nodes: ${stats.nodeCount}, Edges: ${stats.edgeCount}`);
const { GraphDB } = require('@ruvector/graph-wasm/node');
const db = new GraphDB('cosine');
// ... same API as browser
Main class for graph database operations.
new GraphDB(metric?: string)
metric: Distance metric for hypergraph embeddings
"cosine" (default)"euclidean""dotproduct""manhattan"createNode(labels: string[], properties: object): string
Create a node with labels and properties. Returns node ID.
getNode(id: string): JsNode | null
Retrieve a node by ID.
deleteNode(id: string): boolean
Delete a node and its associated edges.
createEdge(
from: string,
to: string,
type: string,
properties: object
): string
Create a directed edge between two nodes.
getEdge(id: string): JsEdge | null
Retrieve an edge by ID.
deleteEdge(id: string): boolean
Delete an edge.
createHyperedge(
nodes: string[],
description: string,
embedding?: number[],
confidence?: number
): string
Create an n-ary relationship connecting multiple nodes.
getHyperedge(id: string): JsHyperedge | null
Retrieve a hyperedge by ID.
async query(cypher: string): Promise<QueryResult>
Execute a Cypher query. Supports basic MATCH and CREATE statements.
async importCypher(statements: string[]): Promise<number>
Import multiple Cypher CREATE statements.
exportCypher(): string
Export the entire database as Cypher CREATE statements.
stats(): object
Get database statistics:
nodeCount: Total number of nodesedgeCount: Total number of edgeshyperedgeCount: Total number of hyperedgeshypergraphEntities: Entities in hypergraph indexhypergraphEdges: Hyperedges in indexavgEntityDegree: Average entity degreeinterface JsNode {
id: string;
labels: string[];
properties: object;
embedding?: number[];
getProperty(key: string): any;
hasLabel(label: string): boolean;
}
interface JsEdge {
id: string;
from: string;
to: string;
type: string;
properties: object;
getProperty(key: string): any;
}
interface JsHyperedge {
id: string;
nodes: string[];
description: string;
embedding: number[];
confidence: number;
properties: object;
order: number; // Number of connected nodes
}
interface QueryResult {
nodes: JsNode[];
edges: JsEdge[];
hyperedges: JsHyperedge[];
data: object[];
count: number;
isEmpty(): boolean;
}
For large result sets, use async query execution with streaming:
import { AsyncQueryExecutor } from '@ruvector/graph-wasm';
const executor = new AsyncQueryExecutor(100); // Batch size
const results = await executor.executeStreaming(
'MATCH (n:Person) RETURN n'
);
Execute queries in the background:
const executor = new AsyncQueryExecutor();
const promise = executor.executeInWorker(
'MATCH (n) RETURN count(n)'
);
Optimize multiple operations:
import { BatchOperations } from '@ruvector/graph-wasm';
const batch = new BatchOperations(1000); // Max batch size
await batch.executeBatch([
'CREATE (n:Person {name: "Alice"})',
'CREATE (n:Person {name: "Bob"})',
// ... more statements
]);
Atomic operation execution:
import { AsyncTransaction } from '@ruvector/graph-wasm';
const tx = new AsyncTransaction();
tx.addOperation('CREATE (n:Person {name: "Alice"})');
tx.addOperation('CREATE (n:Person {name: "Bob"})');
try {
await tx.commit();
} catch (error) {
tx.rollback();
}
Currently supports basic Cypher operations:
CREATE (n:Person {name: "Alice", age: 30})
CREATE (n:Person)-[:KNOWS]->(m:Person)
MATCH (n:Person) RETURN n
MATCH (n:Person)-[r:KNOWS]->(m) RETURN n, r, m
Note: Full Cypher support is planned for future releases.
// Create nodes
const doc1 = db.createNode(['Document'], {
title: 'AI Research',
embedding: [0.1, 0.2, 0.3, ...] // 384-dim vector
});
const doc2 = db.createNode(['Document'], {
title: 'ML Tutorial'
});
const author = db.createNode(['Person'], {
name: 'Dr. Smith'
});
// Create hyperedge connecting all three
const hyperedgeId = db.createHyperedge(
[doc1, doc2, author],
'Documents authored by researcher on related topics',
null, // Auto-generate embedding from node embeddings
0.95 // High confidence
);
const hyperedge = db.getHyperedge(hyperedgeId);
console.log(`Hyperedge connects ${hyperedge.order} nodes`);
# Install wasm-pack
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
# Build for web
npm run build
# Build for all targets
npm run build:all
# Run tests
npm test
See the examples directory for more usage examples:
Contributions are welcome! Please see CONTRIBUTING.md.
MIT - See LICENSE for details.