Skip to content

Commit e3f1755

Browse files
committed
Complete natural createEdge syntax migration
- Update all test files to use createEdge(from, type, to) syntax - Fix edge case in Database.test.ts for empty string validation - All examples now use natural reading: 'alice KNOWS bob' - Maintains backward compatibility with optional properties parameter Phase 1 & 2 Complete: ✅ Core implementation (Database, Nodes, Edges, Transactions) ✅ Query DSL (NodeQuery, TraversalQuery with fluent API) ✅ Natural relationship syntax ✅ Comprehensive unit tests (148 tests) ✅ Integration tests ✅ Job pipeline example ✅ API documentation
1 parent d3028ba commit e3f1755

File tree

7 files changed

+169
-169
lines changed

7 files changed

+169
-169
lines changed

tests/integration/graph-operations.test.ts

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ describe('Complex Graph Operations - Integration Tests', () => {
2727
d: db.createNode('Node', { label: 'D', value: 4 })
2828
};
2929

30-
db.createEdge('LINKS_TO', nodes.a.id, nodes.b.id, { weight: 1 });
31-
db.createEdge('LINKS_TO', nodes.b.id, nodes.c.id, { weight: 2 });
32-
db.createEdge('LINKS_TO', nodes.c.id, nodes.d.id, { weight: 3 });
33-
db.createEdge('LINKS_TO', nodes.d.id, nodes.a.id, { weight: 4 }); // Cycle
30+
db.createEdge(nodes.a.id, 'LINKS_TO', nodes.b.id, { weight: 1 });
31+
db.createEdge(nodes.b.id, 'LINKS_TO', nodes.c.id, { weight: 2 });
32+
db.createEdge(nodes.c.id, 'LINKS_TO', nodes.d.id, { weight: 3 });
33+
db.createEdge(nodes.d.id, 'LINKS_TO', nodes.a.id, { weight: 4 }); // Cycle
3434

3535
// Step 2: Query and transform
3636
const allNodes = db.nodes('Node').exec();
@@ -64,7 +64,7 @@ describe('Complex Graph Operations - Integration Tests', () => {
6464

6565
twoHopNeighbors.forEach(neighbor => {
6666
// Create "indirect" relationship
67-
db.createEdge('INDIRECT', node.id, neighbor.id, { hops: 2 });
67+
db.createEdge(node.id, 'INDIRECT', neighbor.id, { hops: 2 });
6868
});
6969
});
7070

@@ -82,25 +82,25 @@ describe('Complex Graph Operations - Integration Tests', () => {
8282
const languages = db.createNode('Category', { name: 'Languages', level: 1 });
8383
const frameworks = db.createNode('Category', { name: 'Frameworks', level: 1 });
8484

85-
db.createEdge('PARENT_OF', programming.id, languages.id);
86-
db.createEdge('PARENT_OF', programming.id, frameworks.id);
85+
db.createEdge(programming.id, 'PARENT_OF', languages.id);
86+
db.createEdge(programming.id, 'PARENT_OF', frameworks.id);
8787

8888
const webLangs = db.createNode('Category', { name: 'Web Languages', level: 2 });
8989
const systemsLangs = db.createNode('Category', { name: 'Systems Languages', level: 2 });
9090

91-
db.createEdge('PARENT_OF', languages.id, webLangs.id);
92-
db.createEdge('PARENT_OF', languages.id, systemsLangs.id);
91+
db.createEdge(languages.id, 'PARENT_OF', webLangs.id);
92+
db.createEdge(languages.id, 'PARENT_OF', systemsLangs.id);
9393

9494
// Add actual skills
9595
const js = db.createNode('Skill', { name: 'JavaScript' });
9696
const ts = db.createNode('Skill', { name: 'TypeScript' });
9797
const rust = db.createNode('Skill', { name: 'Rust' });
9898
const react = db.createNode('Skill', { name: 'React' });
9999

100-
db.createEdge('BELONGS_TO', js.id, webLangs.id);
101-
db.createEdge('BELONGS_TO', ts.id, webLangs.id);
102-
db.createEdge('BELONGS_TO', rust.id, systemsLangs.id);
103-
db.createEdge('BELONGS_TO', react.id, frameworks.id);
100+
db.createEdge(js.id, 'BELONGS_TO', webLangs.id);
101+
db.createEdge(ts.id, 'BELONGS_TO', webLangs.id);
102+
db.createEdge(rust.id, 'BELONGS_TO', systemsLangs.id);
103+
db.createEdge(react.id, 'BELONGS_TO', frameworks.id);
104104

105105
// Query all skills under "Languages" category
106106
const languageCategories = db.traverse(languages.id)
@@ -148,7 +148,7 @@ describe('Complex Graph Operations - Integration Tests', () => {
148148
// Link jobs to companies
149149
jobs.forEach((job, i) => {
150150
const company = companies[i % companies.length];
151-
db.createEdge('POSTED_BY', job.id, company.id);
151+
db.createEdge(job.id, 'POSTED_BY', company.id);
152152
});
153153

154154
// Complex aggregation: average salary by company size
@@ -226,7 +226,7 @@ describe('Complex Graph Operations - Integration Tests', () => {
226226

227227
try {
228228
const job1 = db.createNode('Job', { title: 'Job 1' });
229-
db.createEdge('POSTED_BY', job1.id, company.id);
229+
db.createEdge(job1.id, 'POSTED_BY', company.id);
230230

231231
ctx.savepoint('job1_created');
232232

@@ -235,14 +235,14 @@ describe('Complex Graph Operations - Integration Tests', () => {
235235
if (job2.properties.title === 'Job 2') {
236236
throw new Error('Simulated error');
237237
}
238-
db.createEdge('POSTED_BY', job2.id, company.id);
238+
db.createEdge(job2.id, 'POSTED_BY', company.id);
239239
} catch (error) {
240240
// Rollback to after job1
241241
ctx.rollbackTo('job1_created');
242242

243243
// Create alternative job2
244244
const job2Alt = db.createNode('Job', { title: 'Job 2 Alt' });
245-
db.createEdge('POSTED_BY', job2Alt.id, company.id);
245+
db.createEdge(job2Alt.id, 'POSTED_BY', company.id);
246246
}
247247

248248
return company.id;
@@ -267,15 +267,15 @@ describe('Complex Graph Operations - Integration Tests', () => {
267267
// Inner operation 1
268268
db.transaction(innerCtx => {
269269
const task1 = db.createNode('Task', { title: 'Task 1' });
270-
db.createEdge('PART_OF', task1.id, project.id);
270+
db.createEdge(task1.id, 'PART_OF', project.id);
271271
});
272272

273273
ctx.savepoint('task1');
274274

275275
// Inner operation 2
276276
db.transaction(innerCtx => {
277277
const task2 = db.createNode('Task', { title: 'Task 2' });
278-
db.createEdge('PART_OF', task2.id, project.id);
278+
db.createEdge(task2.id, 'PART_OF', project.id);
279279
});
280280

281281
// Verify both tasks exist
@@ -297,7 +297,7 @@ describe('Complex Graph Operations - Integration Tests', () => {
297297
const node1 = db.createNode('Node', { label: 'Node 1' });
298298
const node2 = db.createNode('Node', { label: 'Node 2' });
299299

300-
db.createEdge('LINKS', node1.id, node2.id);
300+
db.createEdge(node1.id, 'LINKS', node2.id);
301301

302302
// Create savepoint
303303
ctx.savepoint('after_nodes');
@@ -322,8 +322,8 @@ describe('Complex Graph Operations - Integration Tests', () => {
322322
const job = db.createNode('Job', { title: 'Engineer', salary: 150000 });
323323
const skill = db.createNode('Skill', { name: 'TypeScript', category: 'programming' });
324324

325-
db.createEdge('POSTED_BY', job.id, company.id);
326-
db.createEdge('REQUIRES', job.id, skill.id, { level: 'expert' });
325+
db.createEdge(job.id, 'POSTED_BY', company.id);
326+
db.createEdge(job.id, 'REQUIRES', skill.id, { level: 'expert' });
327327

328328
// Export
329329
const exported = db.export();
@@ -366,7 +366,7 @@ describe('Complex Graph Operations - Integration Tests', () => {
366366
nodes.forEach((node, i) => {
367367
for (let j = 1; j <= 3; j++) {
368368
const targetIndex = (i + j) % nodeCount;
369-
db.createEdge('LINKS', node.id, nodes[targetIndex].id, { weight: j });
369+
db.createEdge(node.id, 'LINKS', nodes[targetIndex].id, { weight: j });
370370
}
371371
});
372372

@@ -436,13 +436,13 @@ describe('Complex Graph Operations - Integration Tests', () => {
436436
// Initial data
437437
const company = db.createNode('Company', { name: 'Company A', id: 'comp-a' });
438438
const job1 = db.createNode('Job', { title: 'Job 1', id: 'job-1' });
439-
db.createEdge('POSTED_BY', job1.id, company.id);
439+
db.createEdge(job1.id, 'POSTED_BY', company.id);
440440

441441
const export1 = db.export();
442442

443443
// Add more data
444444
const job2 = db.createNode('Job', { title: 'Job 2', id: 'job-2' });
445-
db.createEdge('POSTED_BY', job2.id, company.id);
445+
db.createEdge(job2.id, 'POSTED_BY', company.id);
446446

447447
// Export again - this will include all data
448448
const export2 = db.export();
@@ -477,11 +477,11 @@ describe('Complex Graph Operations - Integration Tests', () => {
477477
const d = db.createNode('Node', { label: 'D' });
478478
const e = db.createNode('Node', { label: 'E' });
479479

480-
db.createEdge('LINKS', a.id, b.id);
481-
db.createEdge('LINKS', b.id, c.id);
482-
db.createEdge('LINKS', c.id, d.id);
483-
db.createEdge('LINKS', a.id, e.id);
484-
db.createEdge('LINKS', e.id, d.id);
480+
db.createEdge(a.id, 'LINKS', b.id);
481+
db.createEdge(b.id, 'LINKS', c.id);
482+
db.createEdge(c.id, 'LINKS', d.id);
483+
db.createEdge(a.id, 'LINKS', e.id);
484+
db.createEdge(e.id, 'LINKS', d.id);
485485

486486
// Find shortest path from A to D
487487
const path = db.traverse(a.id).shortestPath(d.id);
@@ -500,9 +500,9 @@ describe('Complex Graph Operations - Integration Tests', () => {
500500
const b = db.createNode('Node', { label: 'B' });
501501
const c = db.createNode('Node', { label: 'C' });
502502

503-
db.createEdge('LINKS', a.id, b.id);
504-
db.createEdge('LINKS', b.id, c.id);
505-
db.createEdge('LINKS', c.id, a.id);
503+
db.createEdge(a.id, 'LINKS', b.id);
504+
db.createEdge(b.id, 'LINKS', c.id);
505+
db.createEdge(c.id, 'LINKS', a.id);
506506

507507
// Traverse with cycle detection (limited depth)
508508
const visited = new Set();
@@ -531,10 +531,10 @@ describe('Complex Graph Operations - Integration Tests', () => {
531531
const c = db.createNode('Node', { label: 'C' });
532532
const d = db.createNode('Node', { label: 'D' });
533533

534-
db.createEdge('LINKS', a.id, b.id);
535-
db.createEdge('LINKS', a.id, c.id);
536-
db.createEdge('LINKS', b.id, d.id);
537-
db.createEdge('LINKS', c.id, d.id);
534+
db.createEdge(a.id, 'LINKS', b.id);
535+
db.createEdge(a.id, 'LINKS', c.id);
536+
db.createEdge(b.id, 'LINKS', d.id);
537+
db.createEdge(c.id, 'LINKS', d.id);
538538

539539
// Find all paths using traversal
540540
const paths = db.traverse(a.id)
@@ -561,8 +561,8 @@ describe('Complex Graph Operations - Integration Tests', () => {
561561
);
562562

563563
outer.forEach(node => {
564-
db.createEdge('LINKS', center.id, node.id);
565-
db.createEdge('LINKS', node.id, center.id);
564+
db.createEdge(center.id, 'LINKS', node.id);
565+
db.createEdge(node.id, 'LINKS', center.id);
566566
});
567567

568568
// Calculate degree centrality
@@ -612,7 +612,7 @@ describe('Complex Graph Operations - Integration Tests', () => {
612612
nodes.forEach((from, i) => {
613613
nodes.forEach((to, j) => {
614614
if (i !== j) {
615-
db.createEdge('LINKS', from.id, to.id);
615+
db.createEdge(from.id, 'LINKS', to.id);
616616
}
617617
});
618618
});
@@ -637,7 +637,7 @@ describe('Complex Graph Operations - Integration Tests', () => {
637637
);
638638

639639
children.forEach(child => {
640-
db.createEdge('PARENT_OF', root.id, child.id);
640+
db.createEdge(root.id, 'PARENT_OF', child.id);
641641
});
642642

643643
// Invariant: Each child has exactly one parent

0 commit comments

Comments
 (0)