This evaluation framework assesses the quality and performance of the Travel Recommendation System using real production data from your Neo4j knowledge graph.
PRIMARY (80%): Real data from production Neo4j graph
- 352 actual cities
- 19,883 real attractions
- 13,519+ real relationships
- Actual user query patterns (if available)
SECONDARY (20%): Synthetic test cases for edge cases
- Hypothetical scenarios
- Stress testing
- Future features
evaluation/
├── kg_quality/ # Knowledge Graph Quality Evaluation
│ ├── entity_popularity_REAL.py # Entity popularity analysis (REAL data)
│ └── [future scripts]
│
├── results/ # Evaluation Results
│ ├── figures/ # Generated plots and visualizations
│ │ └── REAL_entity_popularity.png
│ └── data/ # CSV exports and data files
│ ├── REAL_entity_popularity.csv
│ ├── REAL_high_priority_entities.csv
│ └── evaluation_targets.csv
│
└── README.md # This file
pip install pandas matplotlib seaborn neo4j numpyThe scripts automatically try to load credentials from:
- Streamlit secrets (
.streamlit/secrets.toml) - Recommended - Environment variables - Fallback
No additional configuration needed! The script will use your existing .streamlit/secrets.toml:
[neo4j]
uri = "neo4j+s://your-instance.databases.neo4j.io"
username = "neo4j"
password = "your-password"# Windows PowerShell
$env:NEO4J_URI="neo4j+s://your-instance.databases.neo4j.io"
$env:NEO4J_USER="neo4j"
$env:NEO4J_PASSWORD="your-password"
# Linux/Mac
export NEO4J_URI="neo4j+s://your-instance.databases.neo4j.io"
export NEO4J_USER="neo4j"
export NEO4J_PASSWORD="your-password"cd evaluation/kg_quality
python entity_popularity_REAL.pyFile: kg_quality/entity_popularity_REAL.py
- Extracts ALL entities from your Neo4j graph (19,883+ attractions)
- Simulates query patterns based on entity type, city importance, and discoverability
- Generates visualizations:
- Entity popularity scatter plot
- Top cities by query volume
- Entity type distribution
- Top 20 most-queried entities
- Identifies evaluation priorities using Pareto principle (80/20 rule)
- Exports evaluation targets for manual quality assessment
| File | Description |
|---|---|
results/figures/REAL_entity_popularity.png |
4-panel visualization of entity popularity |
results/data/REAL_entity_popularity.csv |
All entities with simulated query counts |
results/data/REAL_high_priority_entities.csv |
Top 100 entities to evaluate first |
results/data/evaluation_targets.csv |
Manual evaluation checklist (Excel-ready) |
- Pareto Analysis: Top 20% of entities account for ~80% of queries
- City Priority: Major cities (Boston, Cambridge, Salem) get 3x boost
- Discoverability: Entities with websites get 1.5x boost
- Entity Type Weights:
- Cities: 50 (highest)
- Museums: 30
- Restaurants: 25
- Parks/Beaches: 20
- Historic sites: 15
- Cafes: 10
- Bars/Pubs: 8
- Fast Food: 5 (lowest)
python kg_quality/entity_popularity_REAL.pyOpen results/figures/REAL_entity_popularity.png to understand:
- Which entities are most popular
- Geographic distribution of queries
- Entity type breakdown
- Top attractions to prioritize
Open results/data/evaluation_targets.csv in Excel/Google Sheets:
Example:
entity_name: Museum of Fine Arts
accuracy_check: Yes
completeness_check: Partial
notes: Missing opening hours for holidays
Focus on:
- Top 20 entities (highest impact)
- Major cities (Boston, Cambridge, Salem)
- Entities with websites (more discoverable)
- Museums and restaurants (most queried types)
The script calculates how many entities account for 80% of queries:
Top 20% entities = ~3,977 attractions
These account for ~80% of all queries
Implication: Focus evaluation efforts on these high-priority entities first.
Since you may not have user query logs yet, the script simulates realistic patterns:
query_count = base_weight × random_factor × city_boost × website_boost- Base weight: Entity type importance (City=50, Museum=30, etc.)
- Random factor: Log-normal distribution to simulate real-world variance
- City boost: 3x for major cities (Boston, Cambridge, Salem, Worcester, Springfield)
- Website boost: 1.5x for entities with websites
If you implement user query logging in Snowflake:
CREATE TABLE user_search_logs (
log_id VARCHAR(255) PRIMARY KEY,
user_id VARCHAR(255),
entity_searched VARCHAR(255),
search_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP()
);The script will automatically use real data instead of simulations.
Based on the Pareto analysis, prioritize evaluation in this order:
- Manual quality check using
evaluation_targets.csv - Verify accuracy of all properties
- Ensure completeness (hours, website, accessibility)
- Boston, Cambridge, Salem, Worcester, Springfield
- Verify all attractions in these cities
- Check for missing popular attractions
- Museums (cultural significance)
- Restaurants (food tourism)
- Historic sites (tourist interest)
- Parks/Beaches (outdoor activities)
- Remaining entities (20% of queries)
- Spot-check for major errors
- Focus on entities with websites (more visible)
-
RAG Quality Evaluation
- Measure response accuracy
- Test with real user queries
- Compare against ground truth
-
Cypher Generation Accuracy
- Natural language → Cypher conversion success rate
- Syntax error rate
- Semantic correctness
-
Graph Completeness
- Missing relationships
- Orphaned nodes
- Data quality metrics
-
Performance Benchmarks
- Query latency
- LLM response time
- Database connection overhead
Error: Failed to connect to Neo4j
Solution:
- Check your
.streamlit/secrets.tomlcredentials - Verify Neo4j instance is running
- Test connection:
python -c "from neo4j import GraphDatabase; driver = GraphDatabase.driver('uri', auth=('user', 'pass')); driver.verify_connectivity()"
Error: ModuleNotFoundError: No module named 'pandas'
Solution:
pip install pandas matplotlib seaborn neo4j numpyError: Extracted 0 REAL entities from YOUR graph
Solution:
- Check your Cypher query matches your graph schema
- Verify node labels (City, Restaurant, Museum, etc.)
- Run test query in Neo4j Browser:
MATCH (n) WHERE n:City OR n:Restaurant RETURN count(n)
For questions or issues:
- Check the main project README.md
- Review TECHNICAL_DOCUMENTATION.md
- Contact the development team
Same as main project license.
Last Updated: December 12, 2024
Version: 1.0.0
Status: ✅ Ready for Use
