Skip to content

Commit b610061

Browse files
brockwebbclaude
andcommitted
Fix Cypher syntax in seed.py: use double quotes consistently
Fixed quote escaping issues that caused Cypher syntax errors. Changed all string literals in generated Cypher to use double quotes instead of escaped single quotes. Fixes: - AnalysisTask properties: proper list syntax with double-quoted strings - CanonicalConcept/DataProduct/SurveyProcess: double-quoted names - QualityAttribute: double-quoted properties - REQUIRES edges: double-quoted string properties with proper escaping Successfully tested: seeded 5 AnalysisTasks, 5 QualityAttributes, 5 REQUIRES edges, 6 CanonicalConcepts, 4 DataProducts, 6 SurveyProcesses. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 666b516 commit b610061

1 file changed

Lines changed: 19 additions & 17 deletions

File tree

scripts/quarry/seed.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -261,30 +261,30 @@ def seed_layer_0(driver, dry_run=False):
261261

262262
# === CANONICAL CONCEPTS ===
263263
for concept in CANONICAL_CONCEPTS:
264-
stmt = f"MERGE (c:CanonicalConcept {{name: '{concept['name']}'}})"
264+
stmt = f'MERGE (c:CanonicalConcept {{name: "{concept["name"]}"}})'
265265
statements.append(stmt)
266266

267267
# === DATA PRODUCTS ===
268268
for product in DATA_PRODUCTS:
269-
stmt = f"MERGE (dp:DataProduct {{name: '{product['name']}'}})"
269+
stmt = f'MERGE (dp:DataProduct {{name: "{product["name"]}"}})'
270270
statements.append(stmt)
271271

272272
# === SURVEY PROCESSES ===
273273
for process in SURVEY_PROCESSES:
274-
stmt = f"MERGE (sp:SurveyProcess {{name: '{process['name']}'}})"
274+
stmt = f'MERGE (sp:SurveyProcess {{name: "{process["name"]}"}})'
275275
statements.append(stmt)
276276

277277
# === ANALYSIS TASKS ===
278278
for task in ANALYSIS_TASKS:
279-
# Escape single quotes in descriptions
280-
desc = task['description'].replace("'", "\\'")
281-
use_cases = str(task['typical_use_cases']).replace("'", "\\'")
282-
dims = str(task['critical_quality_dimensions'])
283-
284-
stmt = f"""MERGE (t:AnalysisTask {{name: '{task['name']}'}})
285-
ON CREATE SET t.description = '{desc}',
286-
t.typical_use_cases = {use_cases},
287-
t.critical_quality_dimensions = {dims}"""
279+
# Build Cypher list syntax properly (using double quotes for strings inside lists)
280+
desc = task['description']
281+
use_cases_cypher = '[' + ', '.join(f'"{uc}"' for uc in task['typical_use_cases']) + ']'
282+
dims_cypher = '[' + ', '.join(f'"{d}"' for d in task['critical_quality_dimensions']) + ']'
283+
284+
stmt = f"""MERGE (t:AnalysisTask {{name: "{task['name']}"}})
285+
ON CREATE SET t.description = "{desc}",
286+
t.typical_use_cases = {use_cases_cypher},
287+
t.critical_quality_dimensions = {dims_cypher}"""
288288
statements.append(stmt)
289289

290290
# === QUALITY ATTRIBUTES (for REQUIRES targets) ===
@@ -294,8 +294,8 @@ def seed_layer_0(driver, dry_run=False):
294294
qa_nodes[(qa_name, qa_dimension)] = True
295295

296296
for (qa_name, qa_dimension) in qa_nodes.keys():
297-
stmt = f"""MERGE (qa:QualityAttribute {{name: '{qa_name}', dimension: '{qa_dimension}'}})
298-
ON CREATE SET qa.value_type = 'number'"""
297+
stmt = f"""MERGE (qa:QualityAttribute {{name: "{qa_name}", dimension: "{qa_dimension}"}})
298+
ON CREATE SET qa.value_type = "number" """
299299
statements.append(stmt)
300300

301301
# === REQUIRES EDGES ===
@@ -306,13 +306,15 @@ def seed_layer_0(driver, dry_run=False):
306306
if v is None:
307307
prop_lines.append(f"r.{k} = null")
308308
elif isinstance(v, str):
309-
prop_lines.append(f"r.{k} = '{v.replace(chr(39), chr(92) + chr(39))}'") # Escape quotes
309+
# Escape double quotes in string values
310+
escaped_v = v.replace('"', '\\"')
311+
prop_lines.append(f'r.{k} = "{escaped_v}"')
310312
elif isinstance(v, (int, float)):
311313
prop_lines.append(f"r.{k} = {v}")
312314
props_str = ",\n ".join(prop_lines)
313315

314-
stmt = f"""MATCH (t:AnalysisTask {{name: '{task_name}'}})
315-
MATCH (qa:QualityAttribute {{name: '{qa_name}', dimension: '{qa_dimension}'}})
316+
stmt = f"""MATCH (t:AnalysisTask {{name: "{task_name}"}})
317+
MATCH (qa:QualityAttribute {{name: "{qa_name}", dimension: "{qa_dimension}"}})
316318
MERGE (t)-[r:REQUIRES]->(qa)
317319
ON CREATE SET {props_str}"""
318320
statements.append(stmt)

0 commit comments

Comments
 (0)