|
11 | 11 | > **Note: ClickGraph is development-ready for view-based graph analysis with full Neo4j Bolt Protocol 5.8 support. This is a read-only analytical query engine - write operations are not supported. Codebase has diverged from the upstream with DDL/writes feature removal and other structure/code refactoring to follow Rust idiomatic style.** |
12 | 12 |
|
13 | 13 | --- |
14 | | -## Work in Progress towards Next Release |
15 | 14 |
|
16 | | -> **Note: we are standardizing on using `Node` and `Edge` externally following ISO GQL terminology** |
| 15 | +## 🚀 What's New in v0.5.2 (November 30, 2025) |
17 | 16 |
|
18 | | -The next release will be big enhancements to the schema patterns, including |
19 | | -- **Edge ID**: it can be a single column or a composite key with multiple columns for a unique edge instance. Default to (from_id, to_id). |
20 | | -- **Property mapping to expression**: properties can be mapped to expressions represented in simple SQL expressions. |
21 | | -- **Denormalized edge table**: nodes are part of the edge table with denormalized node property columns. Either from_node or to_node or both can be denormalized. |
22 | | -- **Filter support**: a simple SQL predicate can be specified as a filter to a node or edge definition. |
23 | | -- **Array support**: array columns and UNWIND clause to flatten an array value. |
24 | | -- **Coupled edge table**: multiple links occuring in the same event and stored in a single row of an edge table, which is usually denormalized. |
25 | | -- **Polymorphic edge table**: multiple edge types share the same edge table with a type column to indicate its edge type. The edge table also contains `from_label_column` and `to_label_column` to indicate the node labels that are standalone tables. |
| 17 | +### Schema Variations Release - Complete Support for All Edge Table Patterns! 🎉 |
26 | 18 |
|
27 | | -The schema config loading is complete, and most of query support is also finished. Some loose-end work remains. |
| 19 | +**v0.5.2 delivers comprehensive support for advanced schema patterns including polymorphic edges, coupled edges, and denormalized tables.** |
28 | 20 |
|
29 | | -## 🚀 What's New in v0.5.1 (November 21, 2025) |
| 21 | +### Polymorphic Edge Tables ✨ |
| 22 | + |
| 23 | +**Single table containing multiple edge types with dynamic filtering:** |
| 24 | +```yaml |
| 25 | +edges: |
| 26 | + - polymorphic: true |
| 27 | + table: interactions |
| 28 | + type_column: interaction_type # FOLLOWS, LIKES, AUTHORED |
| 29 | + from_label_column: from_type # Source node type |
| 30 | + to_label_column: to_type # Target node type |
| 31 | +``` |
| 32 | +
|
| 33 | +```cypher |
| 34 | +-- Multi-type filter generates IN clause |
| 35 | +MATCH (u:User)-[:FOLLOWS|LIKES]->(target) |
| 36 | +RETURN u.name, target.name |
| 37 | +``` |
| 38 | + |
| 39 | +**What Works:** |
| 40 | +- ✅ **Single-hop wildcard edges**: `(u:User)-[r]->(target)` with unlabeled targets |
| 41 | +- ✅ **Multi-hop CTE chaining**: `(u)-[r1]->(m)-[r2]->(t)` with proper JOINs |
| 42 | +- ✅ **Bidirectional edges**: `(u:User)<-[r]-(source)` using correct JOIN direction |
| 43 | +- ✅ **Composite edge IDs**: `[from_id, to_id, type, timestamp]` for uniqueness |
| 44 | + |
| 45 | +### Coupled Edge Optimization ⚡ |
| 46 | + |
| 47 | +**Automatic JOIN elimination when edges share the same table:** |
| 48 | +```cypher |
| 49 | +-- Zeek DNS pattern: IP → Domain → ResolvedIP (all in dns_log table) |
| 50 | +MATCH (ip:IP)-[:REQUESTED]->(d:Domain)-[:RESOLVED_TO]->(rip:ResolvedIP) |
| 51 | +WHERE ip.ip = '192.168.4.76' |
| 52 | +RETURN ip.ip, d.name, rip.ips |
| 53 | +``` |
| 54 | +Generates optimized SQL with NO self-join - single table scan! |
| 55 | + |
| 56 | +### VLP + UNWIND Support 🔄 |
| 57 | + |
| 58 | +**Decompose paths with ARRAY JOIN:** |
| 59 | +```cypher |
| 60 | +MATCH p = (u:User)-[:FOLLOWS*1..3]->(f:User) |
| 61 | +UNWIND nodes(p) AS n |
| 62 | +RETURN n |
| 63 | +``` |
| 64 | + |
| 65 | +### OPTIONAL MATCH + VLP Fix 🐛 |
| 66 | + |
| 67 | +**Anchor nodes now preserved when no path exists:** |
| 68 | +```cypher |
| 69 | +MATCH (a:User) WHERE a.name = 'Eve' |
| 70 | +OPTIONAL MATCH (a)-[:FOLLOWS*1..3]->(b:User) |
| 71 | +RETURN a.name, COUNT(b) as reachable |
| 72 | +-- Eve (no followers) now correctly returns 1 row with reachable = 0 |
| 73 | +``` |
| 74 | + |
| 75 | +### Test Coverage 🧪 |
| 76 | + |
| 77 | +- **534 library tests passing** (100%) |
| 78 | +- **73 schema variation tests** across 4 schema types: |
| 79 | + - Standard: 30 tests |
| 80 | + - Denormalized: 14 tests |
| 81 | + - Polymorphic: 24 tests |
| 82 | + - Coupled: 5 tests |
| 83 | + |
| 84 | +--- |
| 85 | + |
| 86 | +## 📦 What's in v0.5.1 (November 21, 2025) |
30 | 87 |
|
31 | 88 | ### Official Docker Hub Release! 🐳 |
32 | 89 |
|
|
0 commit comments