1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
# 技术知识图谱构建工具
import networkx as nx
import matplotlib.pyplot as plt
from typing import Dict, List
class TechKnowledgeGraph:
def __init__(self, technology_name: str):
self.technology = technology_name
self.graph = nx.DiGraph()
self.layers = {
'foundation': [], # 基础层
'concept': [], # 概念层
'api': [], # API层
'framework': [], # 框架层
'application': [] # 应用层
}
def add_node(self, name: str, layer: str, description: str = ""):
"""添加知识节点"""
if layer not in self.layers:
raise ValueError(f"Invalid layer: {layer}")
self.graph.add_node(
name,
layer=layer,
description=description
)
self.layers[layer].append(name)
def add_dependency(self, source: str, target: str, relation: str = "depends_on"):
"""添加依赖关系"""
if source not in self.graph.nodes or target not in self.graph.nodes:
raise ValueError("Source or target node does not exist")
self.graph.add_edge(source, target, relation=relation)
def visualize(self):
"""可视化知识图谱"""
plt.figure(figsize=(20, 15))
# 定义节点位置
pos = {}
layer_height = 1.0
for layer, nodes in self.layers.items():
for i, node in enumerate(nodes):
x = (i - len(nodes) / 2) * 0.5
y = layer_height
pos[node] = (x, y)
layer_height += 1.0
# 绘制节点
node_colors = []
for node in self.graph.nodes():
layer = self.graph.nodes[node]['layer']
if layer == 'foundation':
node_colors.append('#FF6B6B')
elif layer == 'concept':
node_colors.append('#4ECDC4')
elif layer == 'api':
node_colors.append('#45B7D1')
elif layer == 'framework':
node_colors.append('#96CEB4')
else:
node_colors.append('#FFEAA7')
nx.draw(
self.graph,
pos,
with_labels=True,
node_color=node_colors,
node_size=3000,
font_size=8,
font_weight='bold',
arrows=True,
arrowsize=20,
edge_color='gray'
)
plt.title(f"{self.technology} 知识图谱", fontsize=20)
plt.axis('off')
plt.tight_layout()
plt.savefig(f"{self.technology}_knowledge_graph.png", dpi=300, bbox_inches='tight')
plt.show()
def get_learning_path(self):
"""获取学习路径"""
# 拓扑排序
learning_path = list(nx.topological_sort(self.graph))
# 按层级分组
path_by_layer = {}
for node in learning_path:
layer = self.graph.nodes[node]['layer']
if layer not in path_by_layer:
path_by_layer[layer] = []
path_by_layer[layer].append(node)
return path_by_layer
def export_to_markdown(self):
"""导出为Markdown格式"""
learning_path = self.get_learning_path()
markdown = f"# {self.technology} 知识图谱\n\n"
markdown += "## 学习路径\n\n"
layer_names = {
'foundation': '基础层',
'concept': '概念层',
'api': 'API层',
'framework': '框架层',
'application': '应用层'
}
for layer in ['foundation', 'concept', 'api', 'framework', 'application']:
if layer in learning_path:
markdown += f"### {layer_names[layer]}\n\n"
for node in learning_path[layer]:
description = self.graph.nodes[node].get('description', '')
markdown += f"- **{node}**: {description}\n"
markdown += "\n"
return markdown
# 使用示例:构建React知识图谱
graph = TechKnowledgeGraph("React")
# 基础层
graph.add_node("JavaScript", "foundation", "JavaScript语言基础")
graph.add_node("HTML/CSS", "foundation", "HTML和CSS基础")
graph.add_node("Node.js", "foundation", "Node.js环境")
# 概念层
graph.add_node("组件", "concept", "React核心概念:组件化")
graph.add_node("虚拟DOM", "concept", "Virtual DOM机制")
graph.add_node("状态管理", "concept", "State和Props")
graph.add_node("生命周期", "concept", "组件生命周期")
# API层
graph.add_node("JSX", "api", "JSX语法")
graph.add_node("Hooks", "api", "React Hooks API")
graph.add_node("Context", "api", "Context API")
graph.add_node("Router", "api", "React Router")
# 框架层
graph.add_node("Redux", "framework", "状态管理框架")
graph.add_node("Next.js", "framework", "React框架")
graph.add_node("Ant Design", "framework", "UI组件库")
# 应用层
graph.add_node("单页应用", "application", "SPA开发")
graph.add_node("服务端渲染", "application", "SSR应用")
graph.add_node("移动应用", "application", "React Native")
# 添加依赖关系
graph.add_dependency("组件", "JavaScript")
graph.add_dependency("虚拟DOM", "JavaScript")
graph.add_dependency("JSX", "JavaScript")
graph.add_dependency("Hooks", "组件")
graph.add_dependency("Redux", "状态管理")
graph.add_dependency("Next.js", "组件")
graph.add_dependency("单页应用", "组件")
graph.add_dependency("单页应用", "Router")
# 可视化
graph.visualize()
# 导出学习路径
learning_path = graph.get_learning_path()
print("学习路径:")
for layer, nodes in learning_path.items():
print(f"\n{layer}: {', '.join(nodes)}")
# 导出Markdown
markdown = graph.export_to_markdown()
with open("React_learning_path.md", "w", encoding="utf-8") as f:
f.write(markdown)
|