olegp156 commited on
Commit
ff2d8da
·
verified ·
1 Parent(s): b335786

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -24
app.py CHANGED
@@ -14,7 +14,7 @@ DATA_FILE = "База философских концептов - База фи
14
  app = FastAPI(
15
  title="Philosophy Knowledge Graph",
16
  description="Онтологическая база философских концептов — Knowledge GraphRAG",
17
- version="3.1.0",
18
  )
19
 
20
  app.add_middleware(
@@ -43,13 +43,14 @@ for _, row in df.iterrows():
43
  tech=row["tech_problem"]
44
  )
45
 
 
46
  for _, row in df.iterrows():
47
  relations = re.findall(r'«([^»]+)»\s*[↔→]\s*«([^»]+)»', str(row["relations"]))
48
  for a, b in relations:
49
  if a in G.nodes and b in G.nodes:
50
  G.add_edge(a, b, label=row["tech_problem"])
51
 
52
- # Цвета по уровням Маслоу
53
  color_map = {
54
  "Физиологические": "#f4a261",
55
  "Безопасность": "#2a9d8f",
@@ -58,6 +59,9 @@ color_map = {
58
  "Самореализация": "#e76f51"
59
  }
60
 
 
 
 
61
  # ---------- API ----------
62
  @app.get("/")
63
  def root():
@@ -66,14 +70,18 @@ def root():
66
 
67
  @app.get("/concepts")
68
  def get_concepts():
69
- nodes = [{"concept": n, **G.nodes[n]} for n in G.nodes()]
70
- return JSONResponse(nodes)
 
 
71
 
72
 
73
  @app.get("/relations")
74
  def get_relations():
75
- edges = [{"source": u, "target": v, "label": d.get("label", "")} for u, v, d in G.edges(data=True)]
76
- return JSONResponse(edges)
 
 
77
 
78
 
79
  @app.get("/jsonld")
@@ -97,28 +105,30 @@ def get_jsonld():
97
  return JSONResponse(jsonld)
98
 
99
 
 
100
  @app.get("/graph", response_class=HTMLResponse)
101
  def get_graph():
102
- """Интерактивный граф с Plotly"""
103
- pos = nx.spring_layout(G, k=0.7, iterations=80, seed=42)
104
 
105
  # --- Рёбра ---
106
  edge_x, edge_y = [], []
107
- for edge in G.edges():
108
- x0, y0 = pos[edge[0]]
109
- x1, y1 = pos[edge[1]]
110
- edge_x += [x0, x1, None]
111
- edge_y += [y0, y1, None]
112
 
113
  edge_trace = go.Scatter(
114
- x=edge_x, y=edge_y,
115
- line=dict(width=0.5, color="#888"),
 
 
116
  hoverinfo="none",
117
- mode="lines"
118
  )
119
 
120
  # --- Узлы ---
121
  node_x, node_y, node_color, node_text = [], [], [], []
 
122
  for node, data in G.nodes(data=True):
123
  x, y = pos[node]
124
  node_x.append(x)
@@ -134,25 +144,27 @@ def get_graph():
134
  mode="markers",
135
  hoverinfo="text",
136
  text=node_text,
137
- marker=dict(showscale=False, color=node_color, size=12, line_width=1),
 
 
 
 
138
  )
139
 
140
  fig = go.Figure(
141
  data=[edge_trace, node_trace],
142
  layout=go.Layout(
143
- title=dict(
144
- text="Онтологическая база философских концептов",
145
- font=dict(size=20)
146
- ),
147
  showlegend=False,
148
  hovermode="closest",
149
  margin=dict(b=0, l=0, r=0, t=40),
150
- xaxis=dict(showgrid=False, zeroline=False),
151
- yaxis=dict(showgrid=False, zeroline=False)
152
  )
153
  )
154
 
155
- return HTMLResponse(content=fig.to_html(full_html=True))
156
 
157
 
158
  # ---------- RUN ----------
 
14
  app = FastAPI(
15
  title="Philosophy Knowledge Graph",
16
  description="Онтологическая база философских концептов — Knowledge GraphRAG",
17
+ version="3.2.0",
18
  )
19
 
20
  app.add_middleware(
 
43
  tech=row["tech_problem"]
44
  )
45
 
46
+ # регулярка для формата: «A» → «B»
47
  for _, row in df.iterrows():
48
  relations = re.findall(r'«([^»]+)»\s*[↔→]\s*«([^»]+)»', str(row["relations"]))
49
  for a, b in relations:
50
  if a in G.nodes and b in G.nodes:
51
  G.add_edge(a, b, label=row["tech_problem"])
52
 
53
+ # Цвета Маслоу
54
  color_map = {
55
  "Физиологические": "#f4a261",
56
  "Безопасность": "#2a9d8f",
 
59
  "Самореализация": "#e76f51"
60
  }
61
 
62
+ # ---------- PRECOMPUTE LAYOUT (ускоряет граф в 30x раз) ----------
63
+ POS = nx.kamada_kawai_layout(G)
64
+
65
  # ---------- API ----------
66
  @app.get("/")
67
  def root():
 
70
 
71
  @app.get("/concepts")
72
  def get_concepts():
73
+ return JSONResponse([
74
+ {"concept": n, **G.nodes[n]}
75
+ for n in G.nodes()
76
+ ])
77
 
78
 
79
  @app.get("/relations")
80
  def get_relations():
81
+ return JSONResponse([
82
+ {"source": u, "target": v, "label": d.get("label", "")}
83
+ for u, v, d in G.edges(data=True)
84
+ ])
85
 
86
 
87
  @app.get("/jsonld")
 
105
  return JSONResponse(jsonld)
106
 
107
 
108
+ # ---------- INTERACTIVE GRAPH ----------
109
  @app.get("/graph", response_class=HTMLResponse)
110
  def get_graph():
111
+ pos = POS
 
112
 
113
  # --- Рёбра ---
114
  edge_x, edge_y = [], []
115
+ for u, v in G.edges():
116
+ x0, y0 = pos[u]
117
+ x1, y1 = pos[v]
118
+ edge_x.extend([x0, x1, None])
119
+ edge_y.extend([y0, y1, None])
120
 
121
  edge_trace = go.Scatter(
122
+ xHydra=edge_x,
123
+ y=edge_y,
124
+ mode="lines",
125
+ line=dict(width=0.5),
126
  hoverinfo="none",
 
127
  )
128
 
129
  # --- Узлы ---
130
  node_x, node_y, node_color, node_text = [], [], [], []
131
+
132
  for node, data in G.nodes(data=True):
133
  x, y = pos[node]
134
  node_x.append(x)
 
144
  mode="markers",
145
  hoverinfo="text",
146
  text=node_text,
147
+ marker=dict(
148
+ size=12,
149
+ color=node_color,
150
+ line=dict(width=1)
151
+ ),
152
  )
153
 
154
  fig = go.Figure(
155
  data=[edge_trace, node_trace],
156
  layout=go.Layout(
157
+ title="Онтологическая база философских концептов",
158
+ titlefont=dict(size=20),
 
 
159
  showlegend=False,
160
  hovermode="closest",
161
  margin=dict(b=0, l=0, r=0, t=40),
162
+ xaxis=dict(showgrid=False, zeroline=False, visible=False),
163
+ yaxis=dict(showgrid=False, zeroline=False, visible=False),
164
  )
165
  )
166
 
167
+ return HTMLResponse(fig.to_html(full_html=False))
168
 
169
 
170
  # ---------- RUN ----------