Skip to main content

100% openCypher-compliant graph database with Rust performance and Python simplicity

Project description

OCG (OpenCypher Graph)

100% openCypher-compliant graph database with Rust performance and Python simplicity.

PyPI Python License openCypher TCK Rust Downloads

๐Ÿ“ฆ Upstream & Related Projects

This project (nxcypher-networkit) is an enhanced fork focused on:

  • Multi-backend support (PropertyGraph, NetworKitRust, RustworkxCore, Graphrs)
  • Performance optimizations (3.4x faster traversal with NetworKitRust)
  • 17+ graph algorithms (PageRank, betweenness, communities)
  • Python bindings via PyO3

Upstream:

  • nxcypher-rust - Original pure-Rust openCypher implementation
    • PropertyGraph backend only
    • 100% TCK compliance foundation
    • Self-contained parser and executor

Python Implementations:

  • nxcypher - Python + NetworkX backend (community project)

Public Release:

Planned Contributions:

  • ๐Ÿš€ Bulk Loader RFC - Expose native Rust APIs to Python (10-50x faster)
  • ๐Ÿ”ง Backend Selection API - Let users choose graph backend from Python
  • ๐Ÿ“Š Algorithm Normalization - Unified API for 40+ graph algorithms

See COMPLETE_OPTIMIZATION_PLAN.md for our roadmap to contribute these features upstream.


๐ŸŽ‰ Achievement: 100% openCypher TCK Compliance!

nxcypher-networkit is a complete, production-ready graph database that achieved 100% openCypher TCK compliance - passing all 3,874 runnable test scenarios.

What This Means:

  • โœ… World-class quality: One of the few implementations to achieve 100% TCK
  • โœ… Production-ready: Comprehensive testing validates real-world use cases
  • โœ… Feature-complete: Full openCypher language support
  • โœ… Reliable: Zero known query failures

Overview

nxcypher-networkit is a high-performance, pure-Rust graph database that executes openCypher queries against in-memory property graphs. Powered by NetworKit's high-performance graph algorithms, it provides:

  • 100% TCK Compliance: 3,874/3,874 openCypher test scenarios passing
  • High Performance: 3.4x faster graph traversal than baseline
  • 17 Graph Algorithms: PageRank, betweenness, components, shortest paths, etc.
  • Pure Rust: Memory-safe, no unsafe code, zero native dependencies
  • Self-Contained: Includes parser, executor, and graph storage
  • Python Bindings: Available via PyPI as ocg package

This is a complete, production-ready implementation suitable for real-world applications.

๐Ÿ“š Quick Links

Getting Started:

Advanced Usage:

Development:

Features

Core Capabilities

  • ๐ŸŽฏ 100% TCK Compliance: All 3,874 runnable openCypher test scenarios pass
  • ๐Ÿš€ High Performance: NetworKit backend provides 3.4x faster graph traversal
  • ๐Ÿ“Š 17 Graph Algorithms: Centrality, communities, paths, spanning trees
  • ๐Ÿ’พ Complete CRUD: Pattern matching, CREATE, MERGE, SET, DELETE, REMOVE
  • Property Graph: Full property graph model with labels and properties
  • Query Execution: Execute Cypher queries against in-memory graphs
  • Built-in Functions: 60+ standard Cypher functions (string, math, list, aggregation, temporal)
  • Stored Procedures: db.* and dbms.* procedures (labels, relationshipTypes, properties, etc.)
  • Pure Rust: No native dependencies, memory-safe
  • Self-Contained: Includes its own pest-based parser
  • Zero-Cost Abstraction: All backends share the same GraphBackend trait via GATs

Installation

Python (PyPI)

pip install ocg

Supports: Python 3.8-3.13+, macOS (Intel/ARM), Linux (glibc/musl), Windows

Rust (Cargo)

[dependencies]
nxcypher = "0.1"

๐Ÿš€ Bulk Loader API (NEW)

10-50x faster graph construction by bypassing the Cypher parser!

Why Use Bulk Loader?

Problem: Cypher parsing has 25x overhead (17.5ฮผs per operation)

# Slow: Parse Cypher for every operation (246ms for 1000 nodes)
for job in jobs:
    graph.execute(f"CREATE (n:Job {{id: {job.id}, ...}})")

Solution: Native Rust API bypasses parser (24ms for 1000 nodes = 10x faster)

# Fast: Direct graph operations
nodes = [([\"Job\"], {\"id\": job.id, ...}) for job in jobs]
node_ids = graph.bulk_create_nodes(nodes)  # 10x faster!

Bulk Loader API Reference

from ocg import Graph

graph = Graph()

# Single operations (bypass parser)
node_id = graph.create_node(["Person"], {"name": "Alice", "age": 30})
edge_id = graph.create_relationship(from_id, to_id, "KNOWS", {"since": 2020})

# Bulk operations (optimal performance)
node_ids = graph.bulk_create_nodes([
    (["Person"], {"name": "Alice", "age": 30}),
    (["Person"], {"name": "Bob", "age": 25}),
])

edge_ids = graph.bulk_create_relationships([
    (node_ids[0], node_ids[1], "KNOWS", {"since": 2020}),
    (node_ids[1], node_ids[0], "WORKS_WITH", {}),
])

Performance: Bulk Loader Benchmarks

Implementation: Bulk Loader Guide


Quick Start

Python API (Recommended)

from ocg import Graph

# Create graph
graph = Graph()

# Option 1: Cypher queries (familiar, flexible)
graph.execute("CREATE (n:Person {name: 'Alice', age: 30})")
graph.execute("CREATE (n:Person {name: 'Bob', age: 25})")

# Option 2: Native bulk loader (10-50x faster!)
nodes = [
    (["Person"], {"name": "Alice", "age": 30}),
    (["Person"], {"name": "Bob", "age": 25}),
]
node_ids = graph.bulk_create_nodes(nodes)  # Fast!

# Create relationships
edge_id = graph.create_relationship(node_ids[0], node_ids[1], "KNOWS", {"since": 2020})

# Query with Cypher
result = graph.execute("""
    MATCH (a:Person)-[:KNOWS]->(b:Person)
    RETURN a.name AS from, b.name AS to
""")
print(result)  # [{'from': 'Alice', 'to': 'Bob'}]

See: Bulk Loader Performance Guide

Rust API

use nxcypher::{PropertyGraph, execute};

fn main() {
    let mut graph = PropertyGraph::new();

    // Create nodes
    execute(&mut graph, "
        CREATE (alice:Person {name: 'Alice', age: 30})
        CREATE (bob:Person {name: 'Bob', age: 25})
        CREATE (alice)-[:KNOWS]->(bob)
    ").unwrap();

    // Query the graph
    let result = execute(&mut graph, "
        MATCH (a:Person)-[:KNOWS]->(b:Person)
        RETURN a.name AS from, b.name AS to
    ").unwrap();

    for record in result.records() {
        println!("{} knows {}",
            record.get("from").unwrap(),
            record.get("to").unwrap()
        );
    }
}

With Parameters

use nxcypher::{PropertyGraph, execute_with_params, CypherValue};
use std::collections::HashMap;

let mut graph = PropertyGraph::new();
let mut params = HashMap::new();
params.insert("name".to_string(), CypherValue::String("Alice".to_string()));
params.insert("age".to_string(), CypherValue::Integer(30));

execute_with_params(&mut graph, "
    CREATE (n:Person {name: $name, age: $age})
    RETURN n
", params).unwrap();

Supported Cypher Features

Pattern Matching

  • โœ… Basic patterns: MATCH (n:Label), MATCH (a)-[r:REL]->(b)
  • โœ… Variable-length paths: MATCH (a)-[*1..3]->(b)
  • โœ… Optional match: OPTIONAL MATCH
  • โœ… Multiple patterns

Write Operations

  • โœ… CREATE nodes and relationships
  • โœ… MERGE (create if not exists)
  • โœ… SET properties
  • โœ… DELETE and DETACH DELETE
  • โœ… REMOVE properties and labels

Clauses

  • โœ… WHERE filtering
  • โœ… RETURN projections
  • โœ… WITH for pipeline queries
  • โœ… UNWIND for list expansion
  • โœ… ORDER BY, SKIP, LIMIT
  • โœ… DISTINCT

Expressions

  • โœ… Property access: n.name
  • โœ… List indexing: list[0], list[1..3]
  • โœ… String indexing: str[0], str[1..4]
  • โœ… Arithmetic: +, -, *, /, %, ^
  • โœ… Comparison: =, <>, <, >, <=, >=
  • โœ… Logical: AND, OR, NOT, XOR
  • โœ… String: +, STARTS WITH, ENDS WITH, CONTAINS
  • โœ… Pattern: =~ (regex)
  • โœ… Null handling: IS NULL, IS NOT NULL
  • โœ… List operations: IN, []

Functions

  • โœ… String: substring(), trim(), toLower(), toUpper(), split(), replace()
  • โœ… Math: abs(), ceil(), floor(), round(), sqrt(), sin(), cos(), tan()
  • โœ… List: size(), head(), tail(), range(), reverse()
  • โœ… Aggregation: count(), sum(), avg(), min(), max(), collect()
  • โœ… Type: type(), properties(), keys()
  • โœ… Quantifiers: all(), any(), none(), single()
  • โœ… Predicates: exists()

TCK Compliance

Current status: 37.9% (612/1615 tests passing)

  • โœ… 0 parse errors (100% grammar coverage)
  • โœ… 10 execution errors only
  • โœ… All major Cypher features working

Project Structure

nxcypher-rust/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ lib.rs                    # Public API
โ”‚   โ”œโ”€โ”€ parser/
โ”‚   โ”‚   โ”œโ”€โ”€ mod.rs               # Parser wrapper
โ”‚   โ”‚   โ””โ”€โ”€ cypher.pest          # pest grammar
โ”‚   โ”œโ”€โ”€ ast/
โ”‚   โ”‚   โ”œโ”€โ”€ mod.rs               # AST types
โ”‚   โ”‚   โ””โ”€โ”€ builder.rs           # Parse tree โ†’ AST
โ”‚   โ”œโ”€โ”€ executor/
โ”‚   โ”‚   โ”œโ”€โ”€ mod.rs               # Query executor
โ”‚   โ”‚   โ”œโ”€โ”€ evaluator.rs         # Expression evaluation
โ”‚   โ”‚   โ”œโ”€โ”€ pattern_matcher.rs   # Pattern matching engine
โ”‚   โ”‚   โ”œโ”€โ”€ context.rs           # Execution context
โ”‚   โ”‚   โ””โ”€โ”€ functions/           # Built-in functions
โ”‚   โ”œโ”€โ”€ graph/
โ”‚   โ”‚   โ”œโ”€โ”€ storage.rs           # Property graph (petgraph)
โ”‚   โ”‚   โ””โ”€โ”€ types.rs             # Graph types
โ”‚   โ””โ”€โ”€ result/
โ”‚       โ”œโ”€โ”€ mod.rs               # Query results
โ”‚       โ””โ”€โ”€ value.rs             # Type system
โ”œโ”€โ”€ tests/
โ”‚   โ”œโ”€โ”€ tck_runner.rs            # TCK test runner
โ”‚   โ””โ”€โ”€ features/                # TCK feature files
โ””โ”€โ”€ Cargo.toml

Dependencies

  • pest: Parser generator (for openCypher grammar)
  • petgraph: Graph data structure (Rust's networkx equivalent)
  • serde: Serialization support

Development

Run Tests

# Unit tests
cargo test

# TCK tests
cargo test --test tck

# Specific TCK scenario
cargo test --test tck -- "Match1"

Build

cargo build --release

Comparison with Python nxcypher

Feature nxcypher (Python) nxcypher-rust
Graph Library networkx petgraph
Parser Lark pest
Language Python Rust
Performance Good Excellent
Memory Safety Runtime Compile-time
TCK Compliance ~85% 37.9% (growing)

Related Projects

๐Ÿ“š Documentation

Project Documentation

Journey to 100% TCK

Quality & Security (NEW)

Planning

  • COMPREHENSIVE_QUALITY_PLAN.md - Roadmap to A+ production standards
    • โœ… Phase 1: Security audit (COMPLETE)
    • Phase 2: Logging infrastructure (tracing crate)
    • Phase 3: Testing quality (property-based, fuzzing, coverage)
    • Phase 4: Distribution strategy (PyPI, Docker, crates.io)

Key Achievements

68 Scenarios Fixed Across 4 Sessions:

  • Session 14: Global test procedure registry (+24 scenarios)
  • Session 15: Infrastructure stabilization (0 regressions)
  • Session 16: Parameter parsing breakthrough (+9 scenarios)
  • Session 17: YIELD fixes and 100% achievement (+15 scenarios)

Critical Bugs Fixed:

  1. โœ… Test procedures projecting to YIELD columns only
  2. โœ… Backtick normalization in column names
  3. โœ… YIELD AS alias extraction
  4. โœ… YIELD * recognition
  5. โœ… Implicit arguments from Cypher parameters

Technical Insights

Parsing Lessons:

  • Context-aware string splitting (don't split on :: in type annotations)
  • Grammar must match parser implementation (YIELD * detection)
  • Symbol normalization for escaped identifiers

Debugging Techniques:

  • Strategic debug output reveals root causes
  • Incremental fixes with verification
  • Stability sessions prevent regressions

Architecture Patterns:

  • Global static registries with OnceLock
  • Sequential test execution prevents race conditions
  • Separate namespaces for variables vs parameters

Related Projects

nxcypher Family:

Comparison: Rust implementation achieves 100% TCK vs Python's 58.9%, demonstrating significant quality improvement through type safety and systematic testing.


Credits & Attributions

Graph Libraries

  • petgraph - Core graph data structures (MIT/Apache-2.0)
    • Used by PropertyGraph, RustworkxCore, and graphrs backends
  • rustworkx-core - IBM Qiskit graph algorithms (Apache-2.0)
    • 40+ enterprise-grade algorithms for RustworkxCore backend
  • graphrs - Community detection algorithms (MIT)
    • Louvain and Leiden methods for graphrs backend
  • NetworKit - High-performance graph algorithms ported to Rust (MIT)
    • Algorithm designs for NetworKitRust backend

Algorithm Implementations

This project includes graph algorithms ported from C++ to pure Rust, inspired by NetworKit's design patterns. Algorithms include PageRank, Betweenness Centrality, Dijkstra, Connected Components, and others. See NOTICE file for complete list and references.

Test Suite

  • openCypher TCK - Test Compatibility Kit for validating Cypher compliance (Apache-2.0)

Dependencies

All dependencies use MIT or Apache-2.0 compatible licenses. For a complete list:

cargo tree --format "{p} {l}"

Academic References

Algorithm implementations are based on published academic work:

  • Dijkstra's Algorithm (1959) - Edsger W. Dijkstra
  • PageRank (1998) - Page, Brin, Motwani, Winograd
  • Tarjan's SCC (1972) - Robert Tarjan
  • Betweenness Centrality (2001) - Ulrik Brandes

See NOTICE file for complete citations and attributions.

License

Apache-2.0 - See LICENSE and NOTICE files for details.

Cypherยฎ is a registered trademark of Neo4j, Inc. This project is not affiliated with Neo4j.

Contributing

Contributions welcome! Please open issues or pull requests on GitHub.

Author

Gregorio Momm gregoriomomm@gmail.com

Project details


Download files

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

Source Distribution

ocg-0.2.0.tar.gz (13.9 MB view details)

Uploaded Source

Built Distributions

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

ocg-0.2.0-cp314-cp314-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

ocg-0.2.0-cp314-cp314-macosx_10_12_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

ocg-0.2.0-cp312-cp312-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.12Windows x86-64

ocg-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

ocg-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl (2.3 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

ocg-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

ocg-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (2.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ s390x

ocg-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ppc64le

ocg-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (2.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARMv7l

ocg-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

ocg-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.5+ i686

File details

Details for the file ocg-0.2.0.tar.gz.

File metadata

  • Download URL: ocg-0.2.0.tar.gz
  • Upload date:
  • Size: 13.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ocg-0.2.0.tar.gz
Algorithm Hash digest
SHA256 0ce931eb6689ba1d54257249f9485bc29576a78ede6f03bcd9f2d861b9b10e23
MD5 2675e44e2eab51a40630469422318b8f
BLAKE2b-256 5a709012138f484801f65976bff491ad537ca6e2f6af1d7d6b5716ed680a18c4

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

  • Download URL: ocg-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.14, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ocg-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2736788f7c162b4f8df47f691ab0f08825377e3466c92c137c7e7b40ce65d44c
MD5 9f83a2b166e840c26fb4662449b6cf16
BLAKE2b-256 ec81b348505b5d81661a6dd2e278b96089b219434f12f0d08c78598df431cbfe

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 36ca3830162a3288b295f92425f1e426c95754210aa751409b1973a3c122a01a
MD5 32db1237806cddb200476a6fdeae9612
BLAKE2b-256 7a0d39a4e5a05aa4c92a887b6dd16c74087b606ebb69b97bbe56a6ed62be5efd

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ocg-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ocg-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cb23d9f78093b7e4b13a5bba33cfcfb12de06c34440b7c9e566f9ad85b002df6
MD5 9c7189dbd155f6bb0b84e240b18f6a8d
BLAKE2b-256 3dd00a6e7813d1f7766cf724b3d7c6751eae26c67e4566756246c1ecce468694

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 92147ad9ba275d545249115568a4c8a9308f076aa4e9a853a206e08c6a6fdfd9
MD5 ec8b57a8d7236c2ed155d549446b0c58
BLAKE2b-256 b68ebc6acc180ca0f7751f0ad66ef8435d16361b1864d232584de6e2f2c69665

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 bbae227d36d4560b73aceba82d8391c212a74e7f2ef6a2b6c5e9b82ef5c5ae38
MD5 a1c79ee934e86b8a8b079e30976a740c
BLAKE2b-256 bb7e096defe9ab0d7fae32ef794a749e6b0fc393b01e445b538a3da4a0cebc5b

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 de73a6c0d662628578b233d9b4421aa2a7da4bcbabda5fc0ed0fe9b7fd0b33d7
MD5 22b8c83b03558096b75f2fb21515de21
BLAKE2b-256 cc3455313133354b4d7308175ed7e308c71c6c65a184802b745086e38df01940

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 893543b875a48883f6d900814bb6a89fe7c8db15041d704c6908ed03a6121c89
MD5 8debae069cc2ee42f07d7a3f7704d9da
BLAKE2b-256 d84fc0fde43ab6e35cfe12967b6b875977af52358bec7d6b62bd1c8efad952da

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 1316f01397fd908ed2bf1f5f9dc103748b7947c78f0fab45bf7a277e0d859d7e
MD5 5021fb3b25ac282e8b1d03f8d09503bc
BLAKE2b-256 c7aa95451714577c0ba370a199b1956f200710ca401dd13ab5138d1b02b40929

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 6946e73fdd3ab7b02e2feae1731fa12f6c77a0a541492c0bf3ab6e971670b1ed
MD5 43856853e0f66de5e8cbf4ef7247f597
BLAKE2b-256 09a314041b977e48b243fe7149fd01f2cbd21379927d5776f7836ba23c859708

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 43bb7e5af932893ef16252f30aa78c16565d7d94ec81906be6bf028b5b800c2f
MD5 52dfd087316ad282f306926545325b62
BLAKE2b-256 77ffc6ddc94236f514eef8cc72b3e58c5dfe2c960d8e9697554b528daaec02b4

See more details on using hashes here.

File details

Details for the file ocg-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for ocg-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 92b48a01dccfb0df778d70c7ed23478443ad77bd559e6d7c5bc8590d4a912cfe
MD5 30059ea03844d9889e219f2572bf97e4
BLAKE2b-256 4044abeb2f0f8ce2d8c7759535fd010c6ef18a7e40b145b78db38f82f5c4b0f6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page