Workshop Review: Technical Accuracy
Purpose: Review workshop content for technical accuracy, query correctness, and Neo4j best practices.
When to use: After pedagogy review is complete and content is ready for technical validation.
Prerequisites:
- •Workshop content is complete
- •Grammar review completed
- •Pedagogy review completed
- •Access to Neo4j instance for testing
Overview
This skill performs a technical accuracy review that checks:
- •Cypher query syntax and correctness
- •Property naming consistency
- •Neo4j best practices
- •Verification files functionality
- •SQL comparisons accuracy
- •Tool references correctness
- •Data model accuracy
This review focuses on TECHNICAL CORRECTNESS, not pedagogy or grammar.
Phase 1: Pre-Review Setup (10 min)
Checklist: Preparation
- • Read WORKSHOP-PLAN.md for technical details
- • Set up Neo4j instance for testing
- • Load workshop data files
- • Review data model
- • Create review tracking document
Setup Test Environment
Required:
- •Neo4j Aura Free instance (or local Neo4j)
- •Workshop data files downloaded
- •Data model imported
- •Access to Query tool
Preparation steps:
- •Create fresh Aura instance
- •Import workshop data using Data Importer
- •Verify all nodes/relationships exist
- •Ready to test queries
Create Tracking Document
Create TECHNICAL-REVIEW-PROGRESS.md:
# Technical Review Progress **Workshop:** [Name] **Reviewer:** Technical Review Skill **Date:** [Date] **Test Instance:** [URL or name] ## Data Model Verification - [ ] Products: [N] nodes - [ ] Customers: [N] nodes - [ ] Orders: [N] nodes - [ ] Relationships verified ## Review Status ### Module 1: [Name] - [ ] Lesson 1 - Technical review - [ ] Lesson 2 - Technical review - [ ] Lesson 3 - Technical review [Continue for all modules...] ## Issues Found - Query error: [Description] - Property naming: [Description] ## Review Complete - All queries tested: Yes/No - All verify.cypher files tested: Yes/No - SQL comparisons verified: Yes/No
Phase 2: Data Model Review (20 min)
Checklist: Data Model
- • All node labels documented
- • All relationship types documented
- • Property names consistent
- • Property types correct
- • Data constraints understood
- • Sample data loaded
Data Model Validation
Verify the data model matches workshop:
// Check node counts
MATCH (n)
RETURN labels(n) AS label, count(n) AS count;
// Check relationship types
MATCH ()-[r]->()
RETURN type(r) AS type, count(r) AS count;
// Check properties on nodes
MATCH (n)
RETURN DISTINCT labels(n) AS label,
[key IN keys(n) | key] AS properties
LIMIT 1;
// Check properties on relationships
MATCH ()-[r]->()
RETURN DISTINCT type(r) AS type,
[key IN keys(r) | key] AS properties
LIMIT 1;
Document findings:
## Data Model ### Nodes - `Product`: [N] nodes - Properties: id, name, unitPrice, unitsInStock - `Customer`: [N] nodes - Properties: id, name, city, country - `Order`: [N] nodes - Properties: id, date, total ### Relationships - `PLACED`: Customer → Order ([N] relationships) - `ORDERS`: Order → Product ([N] relationships) - Properties: quantity, unitPrice
Issues to flag:
- •Missing expected nodes/relationships
- •Property names inconsistent
- •Property types wrong
- •Data not loaded
Phase 3: Query Testing (Per Lesson)
Checklist: Query Testing
- • All Cypher queries run without errors
- • Queries return expected results
- • Property names match data model
- • Query syntax follows best practices
- • Performance is reasonable
Query Testing Process
For each Cypher query in lessons:
- •Copy query from lesson
- •Run in Query tool
- •Verify:
- •No syntax errors
- •Returns results (or appropriate empty set)
- •Results match lesson description
- •Property names correct
- •Check best practices:
- •Uses pattern matching appropriately
- •Avoids anti-patterns
- •Performance is reasonable
Common Query Issues
Issue 1: Property naming
❌ Wrong property names:
MATCH (c:Customer {customerId: 'ALFKI'})
RETURN c.companyName;
✅ Correct property names:
MATCH (c:Customer {id: 'ALFKI'})
RETURN c.name;
Issue 2: Case sensitivity
❌ Wrong case:
match (c:customer) return c.Name;
✅ Correct case:
MATCH (c:Customer) RETURN c.name;
Issue 3: Syntax errors
❌ Missing semicolon or wrong syntax:
MATCH (c:Customer) WHERE c.id = ALFKI // Missing quotes RETURN c.name
✅ Correct syntax:
MATCH (c:Customer) WHERE c.id = 'ALFKI' RETURN c.name;
Issue 4: Anti-patterns
❌ OPTIONAL MATCH for counts:
MATCH (c:Customer) OPTIONAL MATCH (c)-[:PLACED]->(o:Order) RETURN c.name, count(o);
✅ COUNT subquery:
MATCH (c:Customer)
RETURN c.name, COUNT { (c)-[:PLACED]->(:Order) } AS orderCount;
Phase 4: Verification Files Testing (Per Challenge)
Checklist: Verification Files
- • verify.cypher exists
- • verify.cypher runs without errors
- • verify.cypher returns
outcomeandreason - • verify.cypher handles edge cases
- • solution.cypher exists
- • solution.cypher runs without errors
- • solution.cypher passes verification
Verification File Testing Process
For each challenge lesson:
- •
Test verify.cypher
- •Run in Query tool
- •Returns exactly 2 columns:
outcome,reason - •
outcomeis boolean - •
reasonis helpful message
- •
Test with no data
- •Delete nodes:
MATCH (n:NodeLabel) DETACH DELETE n - •Run verify.cypher
- •
outcomeshould be false - •
reasonshould explain what's missing
- •Delete nodes:
- •
Test with partial data
- •Create some but not all expected nodes
- •Run verify.cypher
- •
outcomeshould be false if incomplete - •
reasonshould indicate partial import
- •
Test with complete data
- •Import all expected data
- •Run verify.cypher
- •
outcomeshould be true - •
reasonshould confirm success
- •
Test solution.cypher
- •Start with empty database
- •Run solution.cypher
- •Run verify.cypher
- •
outcomeshould be true
Example Verification Testing
// Test 1: No data
MATCH (n:Product) DETACH DELETE n;
// Run verify.cypher - should return:
// outcome: false
// reason: "No Product nodes found. Make sure you ran the import..."
// Test 2: Partial data
CREATE (:Product {id: "1", name: "Test"});
// Run verify.cypher - should return:
// outcome: false
// reason: "Only 1 Product nodes found. Expected 77."
// Test 3: Complete data
// (Import full dataset)
// Run verify.cypher - should return:
// outcome: true
// reason: "Success! You imported 77 Product nodes."
// Test 4: Solution passes
MATCH (n:Product) DETACH DELETE n;
// Run solution.cypher
// Run verify.cypher - should return:
// outcome: true
Issues to flag:
- •verify.cypher doesn't return
outcomeandreason - •verify.cypher crashes with errors
- •Error messages not helpful
- •solution.cypher doesn't pass verification
- •verification doesn't handle edge cases
Phase 5: SQL Comparison Validation (Per Validation Lesson)
Checklist: SQL Comparisons
- • SQL queries are syntactically correct
- • SQL queries return same results as Cypher
- • SQL queries are fair (not intentionally bad)
- • Comparisons are accurate (lines, JOINs counted correctly)
- • Metrics are defensible
SQL Comparison Testing Process
For each SQL comparison:
- •
Verify SQL syntax
- •SQL query is valid
- •Would run in a relational database
- •Uses appropriate dialect (PostgreSQL, MySQL, etc.)
- •
Verify equivalence
- •SQL produces same results as Cypher
- •Row counts match
- •Columns match
- •Data values match
- •
Verify fairness
- •SQL is reasonable (not intentionally verbose)
- •Uses appropriate JOINs and indexes
- •Represents what a competent SQL developer would write
- •
Verify metrics
- •Line count accurate
- •JOIN count correct
- •Complexity claims defensible
Example SQL Validation
Cypher query:
MATCH (c:Customer {id: 'ALFKI'})
-[:PLACED]->(:Order)
-[:ORDERS]->(p:Product)
RETURN DISTINCT p.name;
SQL equivalent:
SELECT DISTINCT p.productName FROM customers c JOIN orders o ON c.customerId = o.customerId JOIN order_details od ON o.orderId = od.orderId JOIN products p ON od.productId = p.productId WHERE c.customerId = 'ALFKI';
Validation:
- • SQL syntax correct: ✅
- • Returns same products: ✅
- • Fair representation: ✅
- • Metrics: 4 lines vs 7 lines ✅, 0 JOINs vs 3 JOINs ✅
Issues to flag:
- •SQL syntax errors
- •SQL doesn't return same results
- •SQL is intentionally bad/verbose
- •Metrics are inaccurate (wrong JOIN count, wrong line count)
- •Complexity claims not defensible
Phase 6: Property Naming Consistency (Cross-Lesson)
Checklist: Property Names
- • All queries use
id(notcustomerId,productId) - • All queries use
name(notcompanyName,productName) - • All queries use
date(notorderDate) - • Property names match import configuration
- • Consistent across all lessons
Property Naming Validation
Standard property names:
id - for all entity identifiers name - for all entity names date - for order dates total - for order totals city - for customer city country - for customer country unitPrice - for product prices quantity - for order quantities
Search all lessons for:
# Bad patterns to find customerId productId orderId companyName productName orderDate
Should be:
id id id name name date
Issues to flag:
- •Inconsistent property names across lessons
- •Using old property names (customerId instead of id)
- •Property names don't match data model
Phase 7: Neo4j Best Practices Review
Checklist: Best Practices
- • Uses COUNT subqueries (not OPTIONAL MATCH for counts)
- • Uses pattern comprehensions for nested values
- • Appropriate use of indexes (if mentioned)
- • No Cartesian products
- • LIMIT used appropriately
- • No anti-patterns
Best Practice Validation
Pattern 1: COUNT subqueries
❌ Anti-pattern:
MATCH (c:Customer) OPTIONAL MATCH (c)-[:PLACED]->(o:Order) RETURN c.name, count(o);
✅ Best practice:
MATCH (c:Customer)
RETURN c.name, COUNT { (c)-[:PLACED]->(:Order) } AS orderCount;
Pattern 2: Pattern comprehensions
❌ Verbose:
MATCH (c:Customer)-[:PLACED]->(o:Order) WITH c, collect(o.id) AS orderIds RETURN c.name, orderIds;
✅ Concise:
MATCH (c:Customer)
RETURN c.name,
[(c)-[:PLACED]->(o:Order) | o.id] AS orderIds;
Pattern 3: Cartesian products
❌ Accidental Cartesian:
MATCH (c:Customer), (p:Product) WHERE c.country = 'USA' RETURN c.name, p.name;
✅ Intentional or avoided:
MATCH (c:Customer)-[:PLACED]->(:Order)-[:ORDERS]->(p:Product) WHERE c.country = 'USA' RETURN c.name, p.name;
Issues to flag:
- •Use of OPTIONAL MATCH for counts
- •Accidental Cartesian products
- •Missing LIMIT on queries that could return thousands
- •Anti-patterns that should be updated
Phase 8: Tool Reference Accuracy
Checklist: Tool References
- • Module 1 Lesson 3 is tool mechanics source of truth
- • Later lessons reference Module 1 Lesson 3 (not repeat mechanics)
- • Tool names correct (Data Importer, Query tool, Explore)
- • Screenshots match current UI
- • Button text accurate
Tool Reference Validation
Module 1 Lesson 3 should have:
- •Comprehensive Data Importer walkthrough
- •Query tool introduction
- •Explore tool introduction
- •Screenshots of each tool
All other lessons should:
- •Reference Module 1 Lesson 3 for mechanics
- •NOT repeat step-by-step UI instructions
- •Focus on WHAT to do, not HOW to click
Example good reference:
[.slide] == Using Data Importer **Reference:** See Module 1 Lesson 3 for Data Importer mechanics. **Steps for this challenge:** 1. Upload products.csv 2. Map to Product node 3. Configure properties (table below) 4. Run import
Example bad reference (repeating mechanics):
[.slide] == Using Data Importer 1. Click "Import" in the Aura console 2. Click "Add Data" 3. Click "Upload File" 4. Navigate to products.csv 5. Click "Open" [... 20 more steps ...]
Issues to flag:
- •Lessons repeat tool mechanics
- •Don't reference Module 1 Lesson 3
- •Tool names incorrect
- •Screenshots outdated
Phase 9: Building Block Technical Validation
Checklist: Building Block Verification
- • Each challenge actually completes what it claims
- • Verification confirms building block
- • Data model matches building block description
- • Building blocks can be tested independently
Building Block Testing
For each building block:
- •
Read the claim:
- •"Building Block 1: Products exist in the graph ✓"
- •
Verify technically:
cypher// Test: Do products exist? MATCH (p:Product) RETURN count(p) AS productCount; // Should return 77
- •
Verify completeness:
cypher// Test: Do products have required properties? MATCH (p:Product) RETURN p.id, p.name, p.unitPrice, p.unitsInStock LIMIT 1; // Should return all properties
- •
Verify usability:
- •Can this building block be used in next module?
- •Are the right relationships/properties in place?
Example building block tests:
// Building Block 2: "Customer→Order path complete" MATCH path = (c:Customer)-[:PLACED]->(o:Order) RETURN count(path) AS pathCount; // Should return number of orders // Building Block 3: "Customer→Order→Product path complete" MATCH path = (c:Customer)-[:PLACED]->(:Order)-[:ORDERS]->(p:Product) RETURN count(path) AS pathCount; // Should return number of order line items
Issues to flag:
- •Building block claim doesn't match reality
- •Data model incomplete for claimed building block
- •Building block can't be used as described
Phase 10: Final Technical Report
Create Review Summary
Update TECHNICAL-REVIEW-PROGRESS.md with results:
# Technical Review Complete **Workshop:** [Name] **Date Completed:** [Date] **Test Instance:** [URL] ## Summary Assessment ### Data Model: ✅ Pass / ❌ Fail - All nodes present: [Yes/No] - All relationships present: [Yes/No] - Property names consistent: [Yes/No] ### Query Accuracy: ✅ Pass / ❌ Fail - All Cypher queries tested: [N/N] - All queries run without errors: [Yes/No] - Queries return expected results: [Yes/No] ### Verification Files: ✅ Pass / ❌ Fail - All verify.cypher tested: [N/N] - All return outcome + reason: [Yes/No] - All solution.cypher pass verification: [Yes/No] ### SQL Comparisons: ✅ Pass / ❌ Fail - All SQL queries validated: [N/N] - All comparisons accurate: [Yes/No] - All metrics defensible: [Yes/No] ### Best Practices: ✅ Pass / ❌ Fail - Uses COUNT subqueries: [Yes/No] - No anti-patterns found: [Yes/No] - Property naming consistent: [Yes/No] ### Tool References: ✅ Pass / ❌ Fail - Module 1 Lesson 3 is source of truth: [Yes/No] - Later lessons reference correctly: [Yes/No] - No repeated mechanics: [Yes/No] ## Issues Found ### Critical Issues (Must Fix) 1. [Query syntax error in Module X Lesson Y] 2. [verify.cypher doesn't work in Module X Lesson Y] ### Moderate Issues (Should Fix) 1. [Property naming inconsistency in Module X] 2. [SQL comparison metric inaccurate in Module Y] ### Minor Issues (Nice to Fix) 1. [Could use COUNT subquery in Module X Lesson Y] 2. [LIMIT recommended for query in Module Z] ## Test Results ### Queries Tested - Total queries: [N] - Passed: [N] - Failed: [N] ### Verification Files Tested - Total challenges: [N] - verify.cypher working: [N/N] - solution.cypher working: [N/N] ### SQL Comparisons Validated - Total comparisons: [N] - Accurate: [N] - Issues found: [N] ## Recommendations 1. [Recommendation for improvement] 2. [Recommendation for improvement] ## Ready for Publication [✅ / ❌] Workshop is technically accurate and ready for publication. **Issues to resolve before publication:** - [Issue 1] - [Issue 2]
References
- •CONTENT_GUIDELINES.md - Property naming, SQL comparisons
- •.cursor/rules/neo4j-cypher.mdc - Cypher best practices
- •.cursor/review-lesson-content.mdc - Technical review section
- •Neo4j Cypher Manual - Official documentation