修改GraphRAG后端,另外两本小说入库

This commit is contained in:
2026-04-01 15:55:53 +08:00
parent 403b7dfacf
commit bfcf840013
4 changed files with 170 additions and 70 deletions

View File

@@ -1,44 +1,49 @@
SCHEMA_DESCRIPTION = """
大唐双龙传知识图谱 SchemaNeo4j
武侠三部曲知识图谱 SchemaNeo4j
小说标识novel
- dtslz = 大唐双龙传
- ldj = 鹿鼎记
- tlbb = 天龙八部
节点类型:
- Character {name, color}
主要人物:寇仲、徐子陵、宇文化及、傅君婥、宋师道、李靖、石青璇、李密、李子通、
杜伏威、跋锋寒、李世民、李渊、宋缺、寇仲、毕玄、阴后
- Character {novel, name, color}
同名人物在不同小说中会按 novel 隔离
- Location {id, name, type, lat, lng}
- Location {id, novel, source_id, name, type, lat, lng}
type 取值city / town / waterway / landmark / grassland / forest / region
主要城市:扬州(yangzhou)、洛阳(luoyang)、长安/大兴(daxing)、丹阳(danyang)、
梁都、历阳(liyang)、江陵
id 为全局唯一键,格式:{novel}:{source_id}
- Faction {id, name, type, color}
- Faction {id, novel, source_id, name, type, color}
type 取值:朝廷 / 门阀 / 义军 / 游牧政权 / 江湖势力 / 地方军阀 / 帮会 / 外族
主要势力:隋朝(sui)、李阀(li_clan)、宋阀(song_clan)、宇文阀(yuwen)、
瓦岗军(wagang_army)、突厥(turks)、慈航静斋、阴癸派
id 为全局唯一键,格式:{novel}:{source_id}
- Event {id, vol, chapter, description}
vol 是卷号(整数 1-63chapter 是章节号
- Event {id, novel, vol, chapter, description}
id 为全局唯一键,格式:{novel}:vXX_eYYY
vol 是该小说内部卷号整数chapter 是章节号
关系类型:
- (Character)-[:VISITED {vol, chapter, event}]->(Location)
- (Character)-[:VISITED {novel, vol, chapter, event}]->(Location)
人物在某卷某章到访某地
- (Faction)-[:CONTROLS {vol}]->(Location)
- (Faction)-[:CONTROLS {novel, vol}]->(Location)
势力在某卷控制某地
- (Faction)-[:HAS_MEMBER {vol}]->(Character)
- (Faction)-[:HAS_MEMBER {novel, vol}]->(Character)
势力在某卷拥有某成员
- (Character)-[:LEADS {vol}]->(Faction)
- (Character)-[:LEADS {novel, vol}]->(Faction)
人物在某卷领导某势力
- (Event)-[:OCCURRED_AT]->(Location)
事件发生于某地
注意vol 属性用整数表示(如 vol=1 代表第一卷vol=20 代表第二十卷)
查询建议:
- 用户明确提到小说名时,务必加 novel 过滤
- 未指定小说时,可跨小说查询
"""
CYPHER_SYSTEM_PROMPT = f"""你是大唐双龙传知识图谱的 Cypher 查询专家。
CYPHER_SYSTEM_PROMPT = f"""你是武侠三部曲知识图谱的 Cypher 查询专家。
{SCHEMA_DESCRIPTION}
@@ -49,26 +54,30 @@ CYPHER_SYSTEM_PROMPT = f"""你是大唐双龙传知识图谱的 Cypher 查询专
4. 默认加 LIMIT 30除非用户指定数量
5. 使用 DISTINCT 去重
6. 属性名用 n.name、r.vol 格式,不要用整个节点
7. 如果问题完全无法用图谱回答只输出单词UNSUPPORTED
7. 若问题指定小说,优先使用 novel 过滤:
- 大唐双龙传 => novel = "dtslz"
- 鹿鼎记 => novel = "ldj"
- 天龙八部 => novel = "tlbb"
8. 如果问题完全无法用图谱回答只输出单词UNSUPPORTED
示例:
Q: 寇仲去过哪些地方?
A: MATCH (c:Character {{name: "寇仲"}})-[v:VISITED]->(l:Location) RETURN DISTINCT l.name, l.type, min(v.vol) AS first_vol ORDER BY first_vol LIMIT 30
A: MATCH (c:Character {{novel: "dtslz", name: "寇仲"}})-[v:VISITED]->(l:Location) RETURN DISTINCT l.name, l.type, min(v.vol) AS first_vol ORDER BY first_vol LIMIT 30
Q: 第30卷时宇文阀控制哪些城市
A: MATCH (f:Faction {{name: "宇文阀"}})-[r:CONTROLS]->(l:Location) WHERE r.vol <= 30 AND l.type = "city" RETURN DISTINCT l.name, r.vol ORDER BY r.vol LIMIT 30
A: MATCH (f:Faction {{novel: "dtslz", name: "宇文阀"}})-[r:CONTROLS]->(l:Location) WHERE r.vol <= 30 AND l.type = "city" RETURN DISTINCT l.name, r.vol ORDER BY r.vol LIMIT 30
Q: 扬州发生过哪些重要事件?
A: MATCH (e:Event)-[:OCCURRED_AT]->(l:Location {{name: "扬州"}}) RETURN e.description, e.vol, e.chapter ORDER BY e.vol, e.chapter LIMIT 30
A: MATCH (e:Event {{novel: "dtslz"}})-[:OCCURRED_AT]->(l:Location {{novel: "dtslz", name: "扬州"}}) RETURN e.description, e.vol, e.chapter ORDER BY e.vol, e.chapter LIMIT 30
Q: 谁领导过瓦岗军?
A: MATCH (c:Character)-[r:LEADS]->(f:Faction {{name: "瓦岗军"}}) RETURN DISTINCT c.name, r.vol ORDER BY r.vol LIMIT 30
A: MATCH (c:Character)-[r:LEADS]->(f:Faction {{novel: "dtslz", name: "瓦岗军"}}) RETURN DISTINCT c.name, r.vol ORDER BY r.vol LIMIT 30
Q: 寇仲和哪些势力有过关联
A: MATCH (c:Character {{name: "寇仲"}})-[:VISITED]->(l:Location)<-[:CONTROLS]-(f:Faction) RETURN DISTINCT f.name, f.type LIMIT 30
Q: 韦小宝加入过哪些势力
A: MATCH (c:Character {{novel: "ldj", name: "韦小宝"}})<-[:HAS_MEMBER]-(f:Faction) RETURN DISTINCT f.name, f.type LIMIT 30
"""
ANSWER_SYSTEM_PROMPT = """你是大唐双龙传的知识问答助手,熟悉小说中的人物、势力、地点和事件。
ANSWER_SYSTEM_PROMPT = """你是武侠三部曲(大唐双龙传、鹿鼎记、天龙八部)的知识问答助手,熟悉小说中的人物、势力、地点和事件。
请根据知识图谱的查询结果,用中文给出准确、自然的回答:
- 直接回答问题,语言简洁流畅