feat(knowledgeBase): add knowledge graph rebuild and delete functionality
- Add deleteKnowledgeGraph and rebuildKnowledgeGraph API endpoints to knowledgeBase.ts - Add internationalization strings for rebuild confirmation dialog and success/failure messages in both English and Chinese - Implement rebuild mode logic in CreateModal component with confirmation dialog before rebuilding - Add originalType state tracking to distinguish between rebuild and regular edit modes - Update handleSave to trigger graph deletion and rebuild when in rebuild mode with graphrag enabled - Add handleDeleteGraph method to delete existing knowledge graph data before rebuild - Update performSave to use correct type value during save operation in rebuild mode - Enhance Private.tsx to refresh knowledge base details after table data refresh - Import new API functions (deleteKnowledgeGraph, rebuildKnowledgeGraph) in CreateModal - Update KnowledgeGraphCard component timestamp in file header
This commit is contained in:
@@ -296,3 +296,13 @@ export const getKnowledgeGraphEntityTypes = async (query: any) => {
|
|||||||
const response = await request.get(`${apiPrefix}/knowledges/knowledge_graph_entity_types`,query);
|
const response = await request.get(`${apiPrefix}/knowledges/knowledge_graph_entity_types`,query);
|
||||||
return response ;
|
return response ;
|
||||||
};
|
};
|
||||||
|
// 删除图谱
|
||||||
|
export const deleteKnowledgeGraph = async (kb_id: string) => {
|
||||||
|
const response = await request.delete(`${apiPrefix}/knowledges/${kb_id}/knowledge_graph`);
|
||||||
|
return response;
|
||||||
|
};
|
||||||
|
// 知识库图谱重建
|
||||||
|
export const rebuildKnowledgeGraph = async (kb_id: string) => {
|
||||||
|
const response = await request.post(`${apiPrefix}/knowledges/${kb_id}/knowledge_graph`);
|
||||||
|
return response;
|
||||||
|
};
|
||||||
@@ -726,6 +726,11 @@ export const en = {
|
|||||||
graphTips: 'Explore the entity nodes in the knowledge base and their relationship networks',
|
graphTips: 'Explore the entity nodes in the knowledge base and their relationship networks',
|
||||||
sourceDocuments: 'Source Documents',
|
sourceDocuments: 'Source Documents',
|
||||||
rebuildGraph: 'Rebuild Graph',
|
rebuildGraph: 'Rebuild Graph',
|
||||||
|
rebuildConfirmTitle: 'Confirm the rebuild graph',
|
||||||
|
rebuildConfirmContent: 'The rebuild graph will erase the existing map data and rebuild it from scratch. This operation is irreversible. Are you sure you want to proceed?',
|
||||||
|
deleteGraphSuccess: 'Knowledge graph deletion successful',
|
||||||
|
deleteGraphFailed:'Knowledge graph deletion failed',
|
||||||
|
graphEmpty: 'At the foot of the mountain of books, the journey begins.',
|
||||||
createForm:{
|
createForm:{
|
||||||
name: 'Name',
|
name: 'Name',
|
||||||
embedding_id: 'Embedding',
|
embedding_id: 'Embedding',
|
||||||
|
|||||||
@@ -336,6 +336,11 @@ export const zh = {
|
|||||||
graphTitle: '知识图谱:实体、关系与属性的关联网络',
|
graphTitle: '知识图谱:实体、关系与属性的关联网络',
|
||||||
graphTips: '探索知识库中的实体节点及其关系脉络',
|
graphTips: '探索知识库中的实体节点及其关系脉络',
|
||||||
rebuildGraph: '重建图谱',
|
rebuildGraph: '重建图谱',
|
||||||
|
rebuildConfirmTitle: '确认重建图谱',
|
||||||
|
rebuildConfirmContent: '重建图谱将清除现有的图谱数据并重新构建,此操作不可逆。确定要继续吗?',
|
||||||
|
deleteGraphSuccess: '删除知识图谱成功',
|
||||||
|
deleteGraphFailed:'删除知识图谱失败',
|
||||||
|
graphEmpty: '书山有路,此处为始',
|
||||||
createForm: {
|
createForm: {
|
||||||
name: '名称',
|
name: '名称',
|
||||||
embedding_id: '嵌入模型',
|
embedding_id: '嵌入模型',
|
||||||
|
|||||||
@@ -657,6 +657,7 @@ const Private: FC = () => {
|
|||||||
|
|
||||||
const handleRefreshTable = () => {
|
const handleRefreshTable = () => {
|
||||||
// 刷新表格数据
|
// 刷新表格数据
|
||||||
|
fetchKnowledgeBaseDetail(knowledgeBase.id)
|
||||||
tableRef.current?.loadData();
|
tableRef.current?.loadData();
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ import {
|
|||||||
getModelList,
|
getModelList,
|
||||||
createKnowledgeBase,
|
createKnowledgeBase,
|
||||||
updateKnowledgeBase,
|
updateKnowledgeBase,
|
||||||
getKnowledgeGraphEntityTypes
|
getKnowledgeGraphEntityTypes,
|
||||||
|
deleteKnowledgeGraph,
|
||||||
|
rebuildKnowledgeGraph
|
||||||
} from '@/api/knowledgeBase'
|
} from '@/api/knowledgeBase'
|
||||||
import RbModal from '@/components/RbModal'
|
import RbModal from '@/components/RbModal'
|
||||||
const { TextArea } = Input;
|
const { TextArea } = Input;
|
||||||
@@ -31,6 +33,7 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
|||||||
const [activeTab, setActiveTab] = useState('basic');
|
const [activeTab, setActiveTab] = useState('basic');
|
||||||
const [generatingEntityTypes, setGeneratingEntityTypes] = useState(false);
|
const [generatingEntityTypes, setGeneratingEntityTypes] = useState(false);
|
||||||
const [isRebuildMode, setIsRebuildMode] = useState(false);
|
const [isRebuildMode, setIsRebuildMode] = useState(false);
|
||||||
|
const [originalType, setOriginalType] = useState<string>(''); // 保存原始的 type 参数
|
||||||
|
|
||||||
// 监听 parser_config.graphrag 相关字段的变化
|
// 监听 parser_config.graphrag 相关字段的变化
|
||||||
const parserConfig = Form.useWatch('parser_config', form);
|
const parserConfig = Form.useWatch('parser_config', form);
|
||||||
@@ -47,6 +50,7 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
|||||||
setLoading(false);
|
setLoading(false);
|
||||||
setActiveTab('basic');
|
setActiveTab('basic');
|
||||||
setIsRebuildMode(false); // 重置重建模式标识
|
setIsRebuildMode(false); // 重置重建模式标识
|
||||||
|
setOriginalType(''); // 重置原始 type
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -224,9 +228,12 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
|||||||
|
|
||||||
const handleOpen = (record?: KnowledgeBaseListItem | null, type?: string) => {
|
const handleOpen = (record?: KnowledgeBaseListItem | null, type?: string) => {
|
||||||
setDatasets(record || null);
|
setDatasets(record || null);
|
||||||
const nextType = type || currentType;
|
|
||||||
setCurrentType(nextType as any);
|
// 如果是重建模式,使用记录的实际类型,否则使用传入的类型
|
||||||
|
const actualType = type === 'rebuild' ? (record?.type || 'General') : (type || currentType);
|
||||||
|
setCurrentType(actualType as any);
|
||||||
setIsRebuildMode(type === 'rebuild'); // 设置重建模式标识
|
setIsRebuildMode(type === 'rebuild'); // 设置重建模式标识
|
||||||
|
setOriginalType(type || ''); // 保存原始的 type 参数
|
||||||
|
|
||||||
// 如果是重建模式,默认切换到知识图谱标签页
|
// 如果是重建模式,默认切换到知识图谱标签页
|
||||||
if (type === 'rebuild') {
|
if (type === 'rebuild') {
|
||||||
@@ -235,7 +242,7 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
|||||||
setActiveTab('basic');
|
setActiveTab('basic');
|
||||||
}
|
}
|
||||||
|
|
||||||
setBaseFields(record || null, nextType);
|
setBaseFields(record || null, actualType);
|
||||||
getTypeList(record || null);
|
getTypeList(record || null);
|
||||||
setVisible(true);
|
setVisible(true);
|
||||||
};
|
};
|
||||||
@@ -260,6 +267,39 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
|||||||
|
|
||||||
// 封装保存方法,添加提交逻辑
|
// 封装保存方法,添加提交逻辑
|
||||||
const handleSave = () => {
|
const handleSave = () => {
|
||||||
|
// 获取当前表单中的知识图谱开启状态
|
||||||
|
const currentFormValues = form.getFieldsValue();
|
||||||
|
const isGraphragEnabled = currentFormValues?.parser_config?.graphrag?.use_graphrag || false;
|
||||||
|
|
||||||
|
// 如果原始 type 是 'rebuild' 并且知识图谱开启为true,显示确认弹框
|
||||||
|
if (originalType === 'rebuild' && isGraphragEnabled) {
|
||||||
|
confirm({
|
||||||
|
title: t('knowledgeBase.rebuildConfirmTitle'),
|
||||||
|
content: t('knowledgeBase.rebuildConfirmContent'),
|
||||||
|
onOk: async() => {
|
||||||
|
handleDeleteGraph()
|
||||||
|
performSave();
|
||||||
|
await rebuildKnowledgeGraph(datasets?.id || '')
|
||||||
|
},
|
||||||
|
onCancel: () => {
|
||||||
|
// 用户取消,不执行任何操作
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 非重建模式或知识图谱未开启,直接保存
|
||||||
|
performSave();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const handleDeleteGraph = () => {
|
||||||
|
try{
|
||||||
|
deleteKnowledgeGraph(datasets?.id || '')
|
||||||
|
console.log(t('knowledgeBase.deleteGraphSuccess'))
|
||||||
|
}catch(e){
|
||||||
|
messageApi.error(t('knowledgeBase.deleteGraphFailed'))
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// 实际的保存逻辑
|
||||||
|
const performSave = () => {
|
||||||
form
|
form
|
||||||
.validateFields()
|
.validateFields()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -276,9 +316,12 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
|||||||
formValues.parser_config.graphrag.entity_types = entityTypesArray;
|
formValues.parser_config.graphrag.entity_types = entityTypesArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 确保保存时使用正确的类型(不是 'rebuild')
|
||||||
|
const saveType = originalType === 'rebuild' ? currentType : (formValues.type || currentType);
|
||||||
|
|
||||||
const payload: KnowledgeBaseFormData = {
|
const payload: KnowledgeBaseFormData = {
|
||||||
...formValues,
|
...formValues,
|
||||||
type: formValues.type || currentType,
|
type: saveType,
|
||||||
permission_id: formValues.permission_id || 'Private',
|
permission_id: formValues.permission_id || 'Private',
|
||||||
parent_id: datasets?.parent_id || undefined,
|
parent_id: datasets?.parent_id || undefined,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
* @Author: yujiangping
|
* @Author: yujiangping
|
||||||
* @Date: 2025-12-30 15:07:37
|
* @Date: 2025-12-30 15:07:37
|
||||||
* @LastEditors: yujiangping
|
* @LastEditors: yujiangping
|
||||||
* @LastEditTime: 2026-01-05 16:18:53
|
* @LastEditTime: 2026-01-05 20:28:51
|
||||||
*/
|
*/
|
||||||
import React, { useState, useEffect } from 'react'
|
import React, { useState, useEffect } from 'react'
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
@@ -38,7 +38,13 @@ const KnowledgeGraphCard: React.FC<KnowledgeGraphCardProps> = ({ knowledgeBase,
|
|||||||
setLoading(true)
|
setLoading(true)
|
||||||
try {
|
try {
|
||||||
const res = await getKnowledgeGraph(knowledgeBase?.id)
|
const res = await getKnowledgeGraph(knowledgeBase?.id)
|
||||||
setData(res as KnowledgeGraphResponse)
|
// 判断 res.graph 是否为空对象或不存在
|
||||||
|
const graphResponse = res as KnowledgeGraphResponse;
|
||||||
|
if (!graphResponse || !graphResponse.graph || Object.keys(graphResponse.graph).length === 0) {
|
||||||
|
setData(undefined) // 设置为 undefined 以显示 empty 状态
|
||||||
|
} else {
|
||||||
|
setData(graphResponse)
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取知识图谱数据失败:', error)
|
console.error('获取知识图谱数据失败:', error)
|
||||||
} finally {
|
} finally {
|
||||||
@@ -68,7 +74,10 @@ const KnowledgeGraphCard: React.FC<KnowledgeGraphCardProps> = ({ knowledgeBase,
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='rb:p-4 rb:pt-0'>
|
<div className='rb:p-4 rb:pt-0'>
|
||||||
{knowledgeBase?.parser_config?.graphrag?.use_graphrag ? (<KnowledgeGraph data={data} loading={loading} />) : <Empty />}
|
{knowledgeBase?.parser_config?.graphrag?.use_graphrag ?
|
||||||
|
(<KnowledgeGraph data={data} loading={loading} />)
|
||||||
|
:
|
||||||
|
<Empty title={t('knowledgeBase.graphEmpty')}/>}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user