Skip to content

Commit b07ab38

Browse files
committed
feat(schema): add relationshipWeight and RelationshipExtractor
- Add traversal weight property (0.0-1.0) to edge interfaces - Add RelationshipExtractor interface for declarative edge extraction - Update CoreNode.relationships to use extractors instead of edge arrays - Add weights to all core TypeScript edge types - Refactor node relationship definitions to use new extractor pattern
1 parent c572b89 commit b07ab38

File tree

1 file changed

+93
-13
lines changed

1 file changed

+93
-13
lines changed

src/core/config/schema.ts

Lines changed: 93 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,14 @@ export interface Neo4jEdgeProperties {
158158
source: 'ast' | 'decorator' | 'pattern' | 'inference';
159159
confidence: number;
160160

161+
// === TRAVERSAL SCORING ===
162+
/**
163+
* Weight for traversal prioritization (0.0 - 1.0)
164+
* Higher weights indicate more important relationships to follow
165+
* Used in combination with query relevance and depth penalty
166+
*/
167+
relationshipWeight: number;
168+
161169
// === CORE METADATA ===
162170
filePath: string;
163171
createdAt: string;
@@ -278,6 +286,31 @@ export interface ContextExtractor {
278286
priority: number;
279287
}
280288

289+
/**
290+
* Relationship Extractor Definition
291+
* Maps an edge type to the AST method that extracts the related node(s)
292+
*/
293+
export interface RelationshipExtractor {
294+
edgeType: CoreEdgeType;
295+
/**
296+
* AST method name to call on the source node
297+
* - For single node: 'getBaseClass', 'getReturnTypeNode'
298+
* - For array of nodes: 'getImplements', 'getTypeArguments'
299+
*/
300+
method: string;
301+
/**
302+
* Whether the method returns a single node or an array
303+
* - 'single': Method returns one node (e.g., getBaseClass)
304+
* - 'array': Method returns array of nodes (e.g., getImplements)
305+
*/
306+
cardinality: 'single' | 'array';
307+
/**
308+
* The target node type to create/link to
309+
* Used to find existing nodes or create new ones
310+
*/
311+
targetNodeType: CoreNodeType;
312+
}
313+
281314
/**
282315
* Core Schema Node Definition
283316
*/
@@ -286,7 +319,13 @@ export interface CoreNode {
286319
astNodeKind: number;
287320
astGetter: string; // Method name to call on parent AST node (e.g., 'getMethods', 'getProperties')
288321
properties: PropertyDefinition[];
289-
relationships: CoreEdgeType[];
322+
323+
/**
324+
* Relationship extractors - defines how to find related nodes and create edges
325+
* Unlike 'children' which handles containment, these handle references to other nodes
326+
* Example: Class EXTENDS BaseClass, Class IMPLEMENTS Interface
327+
*/
328+
relationships?: RelationshipExtractor[];
290329

291330
// Children map - defines what child nodes to parse and what edge to create
292331
// Key: Child CoreNodeType, Value: Edge type to create between parent and child
@@ -308,6 +347,11 @@ export interface CoreEdge {
308347
sourceTypes: CoreNodeType[];
309348
targetTypes: CoreNodeType[];
310349
properties: PropertyDefinition[];
350+
/**
351+
* Default traversal weight for this core edge type (0.0 - 1.0)
352+
* Can be overridden by framework-specific edge enhancements
353+
*/
354+
relationshipWeight: number;
311355
neo4j: {
312356
relationshipType: string;
313357
direction: 'OUTGOING' | 'INCOMING' | 'BIDIRECTIONAL';
@@ -351,6 +395,17 @@ export interface FrameworkEnhancement {
351395
export interface EdgeEnhancement {
352396
name: string;
353397
semanticType: string; // Can be SemanticEdgeType or framework-specific edge type
398+
/**
399+
* Traversal weight for this relationship type (0.0 - 1.0)
400+
* Higher weights = more important to follow during traversal
401+
*
402+
* Weight tiers:
403+
* - Critical (0.9-1.0): Primary architectural relationships (INJECTS, EXPOSES)
404+
* - High (0.7-0.8): Important semantic relationships (GUARDED_BY, MODULE_IMPORTS)
405+
* - Medium (0.5-0.6): Supporting relationships (VALIDATES, TRANSFORMS)
406+
* - Low (0.3-0.4): Structural relationships (CONTAINS, DECORATED_WITH)
407+
*/
408+
relationshipWeight: number;
354409
detectionPattern: (
355410
parsedSourceNode: ParsedNode,
356411
parsedTargetNode: ParsedNode,
@@ -437,7 +492,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
437492
neo4j: { indexed: true, unique: false, required: true },
438493
},
439494
],
440-
relationships: [CoreEdgeType.CONTAINS, CoreEdgeType.IMPORTS, CoreEdgeType.EXPORTS],
495+
relationships: [], // SourceFile doesn't have reference relationships, only containment
441496
children: {
442497
[CoreNodeType.CLASS_DECLARATION]: CoreEdgeType.CONTAINS,
443498
[CoreNodeType.INTERFACE_DECLARATION]: CoreEdgeType.CONTAINS,
@@ -482,10 +537,18 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
482537
},
483538
],
484539
relationships: [
485-
CoreEdgeType.HAS_MEMBER,
486-
CoreEdgeType.EXTENDS,
487-
CoreEdgeType.IMPLEMENTS,
488-
CoreEdgeType.DECORATED_WITH,
540+
{
541+
edgeType: CoreEdgeType.EXTENDS,
542+
method: 'getBaseClass',
543+
cardinality: 'single',
544+
targetNodeType: CoreNodeType.CLASS_DECLARATION,
545+
},
546+
{
547+
edgeType: CoreEdgeType.IMPLEMENTS,
548+
method: 'getImplements',
549+
cardinality: 'array',
550+
targetNodeType: CoreNodeType.INTERFACE_DECLARATION,
551+
},
489552
],
490553
children: {
491554
[CoreNodeType.METHOD_DECLARATION]: CoreEdgeType.HAS_MEMBER,
@@ -531,7 +594,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
531594
neo4j: { indexed: true, unique: false, required: true },
532595
},
533596
],
534-
relationships: [CoreEdgeType.HAS_PARAMETER, CoreEdgeType.CALLS, CoreEdgeType.DECORATED_WITH],
597+
relationships: [], // CALLS would need call-site analysis, not implemented yet
535598
children: {
536599
[CoreNodeType.PARAMETER_DECLARATION]: CoreEdgeType.HAS_PARAMETER,
537600
[CoreNodeType.DECORATOR]: CoreEdgeType.DECORATED_WITH,
@@ -574,7 +637,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
574637
neo4j: { indexed: true, unique: false, required: true },
575638
},
576639
],
577-
relationships: [CoreEdgeType.TYPED_AS, CoreEdgeType.DECORATED_WITH],
640+
relationships: [], // TYPED_AS would need type resolution, not implemented yet
578641
children: {
579642
[CoreNodeType.DECORATOR]: CoreEdgeType.DECORATED_WITH,
580643
},
@@ -598,7 +661,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
598661
neo4j: { indexed: true, unique: false, required: true },
599662
},
600663
],
601-
relationships: [CoreEdgeType.TYPED_AS, CoreEdgeType.DECORATED_WITH],
664+
relationships: [], // TYPED_AS would need type resolution, not implemented yet
602665
children: {
603666
[CoreNodeType.DECORATOR]: CoreEdgeType.DECORATED_WITH,
604667
},
@@ -622,7 +685,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
622685
neo4j: { indexed: true, unique: false, required: true },
623686
},
624687
],
625-
relationships: [CoreEdgeType.IMPORTS],
688+
relationships: [], // IMPORTS to SourceFile would need module resolution
626689
children: {},
627690
neo4j: {
628691
labels: ['Import', 'TypeScript'],
@@ -672,7 +735,14 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
672735
neo4j: { indexed: true, unique: false, required: true },
673736
},
674737
],
675-
relationships: [CoreEdgeType.EXTENDS, CoreEdgeType.HAS_MEMBER],
738+
relationships: [
739+
{
740+
edgeType: CoreEdgeType.EXTENDS,
741+
method: 'getExtends',
742+
cardinality: 'array',
743+
targetNodeType: CoreNodeType.INTERFACE_DECLARATION,
744+
},
745+
],
676746
children: {},
677747
neo4j: {
678748
labels: ['Interface', 'TypeScript'],
@@ -727,7 +797,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
727797
neo4j: { indexed: true, unique: false, required: true },
728798
},
729799
],
730-
relationships: [CoreEdgeType.HAS_PARAMETER, CoreEdgeType.CALLS],
800+
relationships: [], // CALLS would need call-site analysis, not implemented yet
731801
children: {
732802
[CoreNodeType.PARAMETER_DECLARATION]: CoreEdgeType.HAS_PARAMETER,
733803
},
@@ -772,7 +842,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
772842
neo4j: { indexed: true, unique: false, required: true },
773843
},
774844
],
775-
relationships: [CoreEdgeType.HAS_PARAMETER],
845+
relationships: [], // Parameters are handled via children, not relationship extractors
776846
children: {
777847
[CoreNodeType.PARAMETER_DECLARATION]: CoreEdgeType.HAS_PARAMETER,
778848
},
@@ -832,6 +902,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
832902
neo4j: { indexed: true, unique: false, required: true },
833903
},
834904
],
905+
relationshipWeight: 0.4, // Structural - useful but not primary focus
835906
neo4j: {
836907
relationshipType: 'CONTAINS',
837908
direction: 'OUTGOING',
@@ -860,6 +931,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
860931
neo4j: { indexed: true, unique: false, required: true },
861932
},
862933
],
934+
relationshipWeight: 0.6, // Medium - important for understanding class structure
863935
neo4j: {
864936
relationshipType: 'HAS_MEMBER',
865937
direction: 'OUTGOING',
@@ -888,6 +960,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
888960
neo4j: { indexed: true, unique: false, required: true },
889961
},
890962
],
963+
relationshipWeight: 0.35, // Low - rarely primary traversal target
891964
neo4j: {
892965
relationshipType: 'HAS_PARAMETER',
893966
direction: 'OUTGOING',
@@ -917,6 +990,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
917990
neo4j: { indexed: true, unique: false, required: true },
918991
},
919992
],
993+
relationshipWeight: 0.3, // Low - metadata, not code flow
920994
neo4j: {
921995
relationshipType: 'DECORATED_WITH',
922996
direction: 'OUTGOING',
@@ -941,6 +1015,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
9411015
neo4j: { indexed: true, unique: false, required: true },
9421016
},
9431017
],
1018+
relationshipWeight: 0.55, // Medium - useful for dependency tracing
9441019
neo4j: {
9451020
relationshipType: 'IMPORTS',
9461021
direction: 'OUTGOING',
@@ -969,6 +1044,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
9691044
neo4j: { indexed: true, unique: false, required: true },
9701045
},
9711046
],
1047+
relationshipWeight: 0.5, // Medium - public API surface
9721048
neo4j: {
9731049
relationshipType: 'EXPORTS',
9741050
direction: 'OUTGOING',
@@ -993,6 +1069,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
9931069
neo4j: { indexed: true, unique: false, required: true },
9941070
},
9951071
],
1072+
relationshipWeight: 0.85, // High - inheritance is critical for understanding
9961073
neo4j: {
9971074
relationshipType: 'EXTENDS',
9981075
direction: 'OUTGOING',
@@ -1017,6 +1094,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
10171094
neo4j: { indexed: true, unique: false, required: true },
10181095
},
10191096
],
1097+
relationshipWeight: 0.75, // High - contract relationships are important
10201098
neo4j: {
10211099
relationshipType: 'IMPLEMENTS',
10221100
direction: 'OUTGOING',
@@ -1041,6 +1119,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
10411119
neo4j: { indexed: true, unique: false, required: true },
10421120
},
10431121
],
1122+
relationshipWeight: 0.5, // Medium - type info useful but not primary
10441123
neo4j: {
10451124
relationshipType: 'TYPED_AS',
10461125
direction: 'OUTGOING',
@@ -1065,6 +1144,7 @@ export const CORE_TYPESCRIPT_SCHEMA: CoreTypeScriptSchema = {
10651144
neo4j: { indexed: true, unique: false, required: true },
10661145
},
10671146
],
1147+
relationshipWeight: 0.85, // Critical - execution flow is primary
10681148
neo4j: {
10691149
relationshipType: 'CALLS',
10701150
direction: 'OUTGOING',

0 commit comments

Comments
 (0)