Skip to content

Commit cac5fad

Browse files
fix: Schema Statemanagement issue
1 parent 2c1a626 commit cac5fad

File tree

3 files changed

+75
-57
lines changed

3 files changed

+75
-57
lines changed

frontend/src/components/Popups/GraphEnhancementDialog/EnitityExtraction/NewEntityExtractionSetting.tsx

Lines changed: 39 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { showNormalToast } from '../../../../utils/Toasts';
99
import PatternContainer from './PatternContainer';
1010
import SchemaViz from '../../../Graph/SchemaViz';
1111
import GraphPattern from './GraphPattern';
12-
import { updateLocalStorage, extractOptions } from '../../../../utils/Utils';
12+
import { updateLocalStorage, extractOptions, parseRelationshipString } from '../../../../utils/Utils';
1313
import TooltipWrapper from '../../../UI/TipWrapper';
1414

1515
export default function NewEntityExtractionSetting({
@@ -33,9 +33,6 @@ export default function NewEntityExtractionSetting({
3333
closeEnhanceGraphSchemaDialog?: () => void;
3434
}) {
3535
const {
36-
// selectedRels,
37-
// selectedNodes,
38-
// allPatterns,
3936
setSelectedRels,
4037
setSelectedNodes,
4138
userDefinedPattern,
@@ -67,12 +64,12 @@ export default function NewEntityExtractionSetting({
6764
const { userCredentials } = useCredentials();
6865
const [openGraphView, setOpenGraphView] = useState<boolean>(false);
6966
const [viewPoint, setViewPoint] = useState<string>('tableView');
67+
const [combinedPatterns, setCombinedPatterns] = useState<string[]>([]);
7068
const [tupleOptions, setTupleOptions] = useState<TupleType[]>([]);
7169
const [selectedSource, setSource] = useState<OptionType | null>(null);
7270
const [selectedType, setType] = useState<OptionType | null>(null);
7371
const [selectedTarget, setTarget] = useState<OptionType | null>(null);
7472
const [highlightPattern, setHighlightedPattern] = useState<string | null>(null);
75-
const [combinedPatterns, setCombinedPatterns] = useState<string[]>([]);
7673
const [combinedNodes, setCombinedNodes] = useState<OptionType[]>([]);
7774
const [combinedRels, setCombinedRels] = useState<OptionType[]>([]);
7875
const [isSchemaMenuOpen, setIsSchemaMenuOpen] = useState<boolean>(false);
@@ -101,7 +98,6 @@ export default function NewEntityExtractionSetting({
10198
dbRels,
10299
schemaValRels,
103100
]);
104-
105101
useEffect(() => {
106102
if (userDefinedPattern.length > 0) {
107103
const lastPattern = userDefinedPattern[0];
@@ -112,14 +108,6 @@ export default function NewEntityExtractionSetting({
112108
}
113109
}, [userDefinedPattern]);
114110

115-
// useEffect(() => {
116-
// if (allPatterns.length) {
117-
// setCombinedNodes(selectedNodes as OptionType[]);
118-
// setCombinedPatterns(allPatterns);
119-
// setCombinedRels(selectedRels as OptionType[]);
120-
// }
121-
// }, [allPatterns, selectedNodes, selectedRels]);
122-
123111
const handleFinalClear = () => {
124112
// overall
125113
setSelectedNodes([]);
@@ -187,7 +175,7 @@ export default function NewEntityExtractionSetting({
187175
setTarget(target as OptionType);
188176
};
189177

190-
const handleAddPattern = () => {
178+
const handleAddPattern = (tupleOptionsValue: TupleType[]) => {
191179
if (selectedSource && selectedType && selectedTarget) {
192180
const patternValue = `${selectedSource.value} -[:${selectedType.value}]-> ${selectedTarget.value}`;
193181
const relValue = `${selectedSource.value},${selectedType.value},${selectedTarget.value}`;
@@ -198,7 +186,6 @@ export default function NewEntityExtractionSetting({
198186
target: selectedTarget.value || '',
199187
type: selectedType.value || '',
200188
};
201-
// Update User Defined Patterns
202189
setUserDefinedPattern((prev: string[]) => {
203190
const alreadyExists = prev.includes(patternValue);
204191
if (!alreadyExists) {
@@ -207,35 +194,35 @@ export default function NewEntityExtractionSetting({
207194
}
208195
return prev;
209196
});
210-
setTupleOptions((prev: TupleType[]) => {
211-
const alreadyExists = prev.some((tuple) => tuple.value === relValue);
212-
if (!alreadyExists) {
213-
const updatedTuples = [relationshipOption, ...prev];
214-
const { nodeLabelOptions, relationshipTypeOptions } = extractOptions(updatedTuples);
215-
setUserDefinedNodes(nodeLabelOptions);
216-
setUserDefinedRels(relationshipTypeOptions);
217-
setAllPatterns((prev) => {
218-
if (!prev.includes(patternValue)) {
219-
return [patternValue, ...prev];
220-
}
221-
return prev;
222-
});
223-
setSelectedNodes((prev) => {
224-
const allNodeValues = prev.map((p) => p.value);
225-
const toAdd = [selectedSource, selectedTarget].filter((node) => !allNodeValues.includes(node.value));
226-
return [...toAdd, ...prev];
227-
});
228-
setSelectedRels((prev) => {
229-
const allRelValues = prev.map((p) => p.value);
230-
if (!allRelValues.includes(selectedType.value)) {
231-
return [selectedType, ...prev];
232-
}
233-
return prev;
234-
});
235-
return updatedTuples;
236-
}
237-
return prev;
238-
});
197+
const alreadyExists = tupleOptionsValue.some((tuple) => tuple.value === relValue);
198+
if (!alreadyExists) {
199+
const updatedTuples = [relationshipOption, ...tupleOptionsValue];
200+
const { nodeLabelOptions, relationshipTypeOptions } = extractOptions(updatedTuples);
201+
setUserDefinedNodes(nodeLabelOptions);
202+
setUserDefinedRels(relationshipTypeOptions);
203+
setAllPatterns((prev) => {
204+
if (!prev.includes(patternValue)) {
205+
return [patternValue, ...prev];
206+
}
207+
return prev;
208+
});
209+
setSelectedNodes((prev) => {
210+
const allNodeValues = prev.map((p) => p.value);
211+
const toAdd = [selectedSource, selectedTarget].filter((node) => !allNodeValues.includes(node.value));
212+
return [...toAdd, ...prev];
213+
});
214+
setSelectedRels((prev) => {
215+
const allRelValues = prev.map((p) => p.value);
216+
if (!allRelValues.includes(selectedType.value)) {
217+
return [selectedType, ...prev];
218+
}
219+
return prev;
220+
});
221+
console.log({ updatedTuples });
222+
setTupleOptions(updatedTuples);
223+
} else {
224+
showNormalToast('Pattern Already Exists');
225+
}
239226
setSource(null);
240227
setType(null);
241228
setTarget(null);
@@ -350,7 +337,13 @@ export default function NewEntityExtractionSetting({
350337
selectedType={selectedType}
351338
selectedTarget={selectedTarget}
352339
onPatternChange={handlePatternChange}
353-
onAddPattern={handleAddPattern}
340+
onAddPattern={() =>
341+
handleAddPattern(
342+
tupleOptions.length > 0
343+
? tupleOptions
344+
: combinedPatterns.map((pattern) => parseRelationshipString(pattern))
345+
)
346+
}
354347
selectedTupleOptions={tupleOptions}
355348
></GraphPattern>
356349
<PatternContainer

frontend/src/components/Popups/GraphEnhancementDialog/EnitityExtraction/PatternContainer.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ const PatternContainer = ({
2424
}: PatternContainerProps) => {
2525
const nodeCount = useMemo(() => nodes?.length ?? 0, [nodes]);
2626
const relCount = useMemo(() => rels?.length ?? 0, [rels]);
27-
28-
console.log('count', nodeCount);
2927
return (
3028
<div className='h-full'>
3129
<div className='flex align-self-center justify-center border'>

frontend/src/utils/Utils.ts

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -575,10 +575,13 @@ export const userDefinedGraphSchema = (nodes: OptionType[], relationships: Optio
575575
};
576576
});
577577

578-
const nodeMap: Record<string, string> = transformedNodes.reduce((acc, node) => {
579-
acc[node.labels[0]] = node.id;
580-
return acc;
581-
}, {} as Record<string, string>);
578+
const nodeMap: Record<string, string> = transformedNodes.reduce(
579+
(acc, node) => {
580+
acc[node.labels[0]] = node.id;
581+
return acc;
582+
},
583+
{} as Record<string, string>
584+
);
582585
const transformedRelationships: ExtendedRelationship[] = relationships
583586
.map((rel, index) => {
584587
const parts = rel.value.split(',');
@@ -693,8 +696,8 @@ export const extractGraphSchemaFromRawData = (
693696
nodes: RawNode[],
694697
relationships: RawRelationship[]
695698
): {
696-
nodes: OptionType[],
697-
relationships: OptionType[]
699+
nodes: OptionType[];
700+
relationships: OptionType[];
698701
} => {
699702
const uniqueLabels = new Set<string>();
700703
const nodeList: OptionType[] = [];
@@ -724,7 +727,7 @@ export const extractGraphSchemaFromRawData = (
724727
}
725728
return {
726729
nodes: nodeList,
727-
relationships: relList
730+
relationships: relList,
728731
};
729732
};
730733

@@ -734,7 +737,7 @@ export const generateGraphFromNodeAndRelVals = (
734737
): UserDefinedGraphSchema => {
735738
const schemeVal: Scheme = {};
736739
const uniqueNodesMap = new Map<string, ExtendedNode>();
737-
console.log('first rels', relVals)
740+
console.log('first rels', relVals);
738741
let nodeIdCounter = 0;
739742
nodeVals.forEach((node) => {
740743
const key = `${node.label}-${node.value}`;
@@ -795,4 +798,28 @@ export const generateGraphFromNodeAndRelVals = (
795798
relationships: transformedRelationships,
796799
scheme: schemeVal,
797800
};
798-
};
801+
};
802+
export function parseRelationshipString(input: string): {
803+
value: string;
804+
label: string;
805+
source: string;
806+
target: string;
807+
type: string;
808+
} {
809+
const regex = /(\w+)\s+-\[:([\w_]+)]->\s+(\w+)/;
810+
const match = input.match(regex);
811+
812+
if (!match) {
813+
throw new Error(`Invalid relationship format: ${input}`);
814+
}
815+
816+
const [_, source, type, target] = match;
817+
818+
return {
819+
value: `${source},${type},${target}`,
820+
label: input,
821+
source,
822+
target,
823+
type,
824+
};
825+
}

0 commit comments

Comments
 (0)