|
2 | 2 | "cells": [ |
3 | 3 | { |
4 | 4 | "cell_type": "markdown", |
5 | | - "id": "a1b2c3d4-0000-0000-0000-000000000001", |
| 5 | + "id": "0", |
6 | 6 | "metadata": {}, |
7 | 7 | "source": [ |
8 | 8 | "# Seed Demo Data\n", |
|
12 | 12 | "Populates CoordiNode with a **tech industry knowledge graph**.\n", |
13 | 13 | "\n", |
14 | 14 | "> **Note:** When using `coordinode-embedded` (`LocalClient(\":memory:\")`), the seeded data\n", |
15 | | - "> lives only inside this notebook process — notebooks 01–03 will start with an empty graph.\n", |
| 15 | + "> lives only inside this notebook process \u2014 notebooks 01\u201303 will start with an empty graph.\n", |
16 | 16 | "> To share the graph across notebooks, point all of them at the same running CoordiNode\n", |
17 | 17 | "> server via `COORDINODE_ADDR`.\n", |
18 | 18 | "\n", |
19 | 19 | "**Graph contents:**\n", |
20 | 20 | "- 10 people (engineers, researchers, founders)\n", |
21 | 21 | "- 6 companies\n", |
22 | 22 | "- 8 technologies / research areas\n", |
23 | | - "- ~35 relationships (WORKS_AT, FOUNDED, KNOWS, RESEARCHES, INVENTED, ACQUIRED, USES, …)\n", |
| 23 | + "- ~35 relationships (WORKS_AT, FOUNDED, KNOWS, RESEARCHES, INVENTED, ACQUIRED, USES, \u2026)\n", |
24 | 24 | "\n", |
25 | 25 | "All nodes carry a `demo=true` property and a `demo_tag` equal to the `DEMO_TAG` variable\n", |
26 | 26 | "set in the seed cell. MERGE operations and cleanup are scoped to that tag, so only nodes\n", |
27 | 27 | "with the matching `demo_tag` are written or removed.\n", |
28 | 28 | "\n", |
29 | 29 | "**Environments:**\n", |
30 | | - "- **Google Colab** — uses `coordinode-embedded` (in-process Rust engine, no server needed). First run compiles from source (~5 min); subsequent runs use the pip cache.\n", |
31 | | - "- **Local / Docker Compose** — connects to a running CoordiNode server via gRPC.\n", |
| 30 | + "- **Google Colab** \u2014 uses `coordinode-embedded` (in-process Rust engine, no server needed). First run compiles from source (~5 min); subsequent runs use the pip cache.\n", |
| 31 | + "- **Local / Docker Compose** \u2014 connects to a running CoordiNode server via gRPC.\n", |
32 | 32 | "\n", |
33 | | - "> **⚠️ Note for real-server use:** All writes and the cleanup step are scoped to `demo_tag`.\n", |
| 33 | + "> **\u26a0\ufe0f Note for real-server use:** All writes and the cleanup step are scoped to `demo_tag`.\n", |
34 | 34 | "> Collisions can occur if multiple runs reuse the same `demo_tag` value or if `demo_tag` is\n", |
35 | 35 | "> empty. Run against a fresh/empty database or choose a unique `demo_tag` to avoid affecting\n", |
36 | 36 | "> unrelated nodes." |
37 | 37 | ] |
38 | 38 | }, |
39 | 39 | { |
40 | 40 | "cell_type": "markdown", |
41 | | - "id": "a1b2c3d4-0000-0000-0000-000000000002", |
| 41 | + "id": "1", |
42 | 42 | "metadata": {}, |
43 | 43 | "source": [ |
44 | 44 | "## Install dependencies" |
|
47 | 47 | { |
48 | 48 | "cell_type": "code", |
49 | 49 | "execution_count": null, |
50 | | - "id": "a1b2c3d4-0000-0000-0000-000000000003", |
51 | | - "metadata": { |
52 | | - "execution": { |
53 | | - "iopub.execute_input": "2026-04-19T10:04:06.039243Z", |
54 | | - "iopub.status.busy": "2026-04-19T10:04:06.039172Z", |
55 | | - "iopub.status.idle": "2026-04-19T10:04:06.970761Z", |
56 | | - "shell.execute_reply": "2026-04-19T10:04:06.970069Z" |
57 | | - } |
58 | | - }, |
| 50 | + "id": "2", |
| 51 | + "metadata": {}, |
59 | 52 | "outputs": [], |
60 | 53 | "source": [ |
61 | 54 | "import os, sys, subprocess\n", |
62 | 55 | "\n", |
63 | 56 | "IN_COLAB = \"google.colab\" in sys.modules\n", |
64 | 57 | "\n", |
65 | 58 | "# Install coordinode-embedded only when running in Colab AND no gRPC server is configured.\n", |
66 | | - "# If COORDINODE_ADDR is set, a live server is already available — skip the 5-min Rust build.\n", |
| 59 | + "# If COORDINODE_ADDR is set, a live server is already available \u2014 skip the 5-min Rust build.\n", |
67 | 60 | "if IN_COLAB and not os.environ.get(\"COORDINODE_ADDR\"):\n", |
68 | 61 | " # Install Rust toolchain via rustup (https://rustup.rs).\n", |
69 | | - " # Colab's apt packages ship rustc ≤1.75, which cannot build coordinode-embedded\n", |
70 | | - " # (requires Rust ≥1.80 for maturin/pyo3). apt-get is not a viable alternative here.\n", |
71 | | - " # Download the installer to a temp file and execute it explicitly — this avoids\n", |
| 62 | + " # Colab's apt packages ship rustc \u22641.75, which cannot build coordinode-embedded\n", |
| 63 | + " # (requires Rust \u22651.80 for maturin/pyo3). apt-get is not a viable alternative here.\n", |
| 64 | + " # Download the installer to a temp file and execute it explicitly \u2014 this avoids\n", |
72 | 65 | " # piping remote content directly into a shell while maintaining HTTPS/TLS security\n", |
73 | 66 | " # through Python's default ssl context (cert-verified, TLS 1.2+).\n", |
74 | 67 | " # SHA256 pinning of rustup-init is intentionally omitted: rustup.rs does not\n", |
|
81 | 74 | " # never runs when a live gRPC server is available, so there is no risk of\n", |
82 | 75 | " # unintentional execution in local or server environments.\n", |
83 | 76 | " # Security note: downloading rustup-init via HTTPS with cert verification and\n", |
84 | | - " # executing from a temp file (not piped to shell) is by design — this is the\n", |
| 77 | + " # executing from a temp file (not piped to shell) is by design \u2014 this is the\n", |
85 | 78 | " # rustup project's own recommended install method for automated environments.\n", |
86 | 79 | " import ssl as _ssl, tempfile as _tmp, urllib.request as _ur\n", |
87 | 80 | "\n", |
|
134 | 127 | }, |
135 | 128 | { |
136 | 129 | "cell_type": "markdown", |
137 | | - "id": "a1b2c3d4-0000-0000-0000-000000000004", |
| 130 | + "id": "3", |
138 | 131 | "metadata": {}, |
139 | 132 | "source": [ |
140 | 133 | "## Connect to CoordiNode\n", |
141 | 134 | "\n", |
142 | | - "- **Colab**: uses `LocalClient(\":memory:\")` — in-process embedded engine, no server required.\n", |
| 135 | + "- **Colab**: uses `LocalClient(\":memory:\")` \u2014 in-process embedded engine, no server required.\n", |
143 | 136 | "- **Local with server**: connects to an existing CoordiNode on port 7080 (set `COORDINODE_ADDR` to override).\n", |
144 | 137 | "- **Local without server**: falls back to `coordinode-embedded` if already installed (see [coordinode-embedded](https://github.com/structured-world/coordinode-python/tree/main/coordinode-embedded)); otherwise shows a `RuntimeError` with install instructions." |
145 | 138 | ] |
146 | 139 | }, |
147 | 140 | { |
148 | 141 | "cell_type": "code", |
149 | 142 | "execution_count": null, |
150 | | - "id": "a1b2c3d4-0000-0000-0000-000000000005", |
151 | | - "metadata": { |
152 | | - "execution": { |
153 | | - "iopub.execute_input": "2026-04-19T10:04:06.972780Z", |
154 | | - "iopub.status.busy": "2026-04-19T10:04:06.972654Z", |
155 | | - "iopub.status.idle": "2026-04-19T10:04:07.012113Z", |
156 | | - "shell.execute_reply": "2026-04-19T10:04:07.011321Z" |
157 | | - } |
158 | | - }, |
| 143 | + "id": "4", |
| 144 | + "metadata": {}, |
159 | 145 | "outputs": [], |
160 | 146 | "source": [ |
161 | 147 | "import os, socket\n", |
|
192 | 178 | " raise RuntimeError(f\"Health check failed for {COORDINODE_ADDR}\")\n", |
193 | 179 | " print(f\"Connected to {COORDINODE_ADDR}\")\n", |
194 | 180 | " else:\n", |
195 | | - " # No server available — use the embedded in-process engine.\n", |
| 181 | + " # No server available \u2014 use the embedded in-process engine.\n", |
196 | 182 | " try:\n", |
197 | 183 | " from coordinode_embedded import LocalClient\n", |
198 | 184 | " except ImportError as exc:\n", |
199 | 185 | " raise RuntimeError(\n", |
200 | 186 | " \"coordinode-embedded is not installed. \"\n", |
201 | 187 | " \"Run: pip install git+https://github.com/structured-world/coordinode-python.git@8da94d694ecaabee6f8380147d02f08220061bfa#subdirectory=coordinode-embedded\"\n", |
202 | | - " \" — or start a CoordiNode server and set COORDINODE_ADDR.\"\n", |
| 188 | + " \" \u2014 or start a CoordiNode server and set COORDINODE_ADDR.\"\n", |
203 | 189 | " ) from exc\n", |
204 | 190 | "\n", |
205 | 191 | " client = LocalClient(\":memory:\")\n", |
|
208 | 194 | }, |
209 | 195 | { |
210 | 196 | "cell_type": "markdown", |
211 | | - "id": "a1b2c3d4-0000-0000-0000-000000000006", |
| 197 | + "id": "5", |
212 | 198 | "metadata": {}, |
213 | 199 | "source": [ |
214 | | - "## Step 1 — Clear previous demo data" |
| 200 | + "## Step 1 \u2014 Clear previous demo data" |
215 | 201 | ] |
216 | 202 | }, |
217 | 203 | { |
218 | 204 | "cell_type": "code", |
219 | 205 | "execution_count": null, |
220 | | - "id": "a1b2c3d4-0000-0000-0000-000000000007", |
221 | | - "metadata": { |
222 | | - "execution": { |
223 | | - "iopub.execute_input": "2026-04-19T10:04:07.014105Z", |
224 | | - "iopub.status.busy": "2026-04-19T10:04:07.013909Z", |
225 | | - "iopub.status.idle": "2026-04-19T10:04:07.020088Z", |
226 | | - "shell.execute_reply": "2026-04-19T10:04:07.019603Z" |
227 | | - } |
228 | | - }, |
| 206 | + "id": "6", |
| 207 | + "metadata": {}, |
229 | 208 | "outputs": [], |
230 | 209 | "source": [ |
231 | 210 | "import uuid\n", |
|
234 | 213 | "print(\"Using DEMO_TAG:\", DEMO_TAG)\n", |
235 | 214 | "# Remove prior demo nodes and any attached relationships in one step to avoid\n", |
236 | 215 | "# duplicate relationship matches during cleanup (undirected MATCH -[r]-() returns\n", |
237 | | - "# each edge twice — once per endpoint — causing duplicate-delete errors).\n", |
| 216 | + "# each edge twice \u2014 once per endpoint \u2014 causing duplicate-delete errors).\n", |
238 | 217 | "client.cypher(\n", |
239 | 218 | " \"MATCH (n {demo: true, demo_tag: $tag}) DETACH DELETE n\",\n", |
240 | 219 | " params={\"tag\": DEMO_TAG},\n", |
|
244 | 223 | }, |
245 | 224 | { |
246 | 225 | "cell_type": "markdown", |
247 | | - "id": "a1b2c3d4-0000-0000-0000-000000000008", |
| 226 | + "id": "7", |
248 | 227 | "metadata": {}, |
249 | 228 | "source": [ |
250 | | - "## Step 2 — Create nodes" |
| 229 | + "## Step 2 \u2014 Create nodes" |
251 | 230 | ] |
252 | 231 | }, |
253 | 232 | { |
254 | 233 | "cell_type": "code", |
255 | 234 | "execution_count": null, |
256 | | - "id": "a1b2c3d4-0000-0000-0000-000000000009", |
257 | | - "metadata": { |
258 | | - "execution": { |
259 | | - "iopub.execute_input": "2026-04-19T10:04:07.021785Z", |
260 | | - "iopub.status.busy": "2026-04-19T10:04:07.021661Z", |
261 | | - "iopub.status.idle": "2026-04-19T10:04:07.057106Z", |
262 | | - "shell.execute_reply": "2026-04-19T10:04:07.056653Z" |
263 | | - } |
264 | | - }, |
| 235 | + "id": "8", |
| 236 | + "metadata": {}, |
265 | 237 | "outputs": [], |
266 | 238 | "source": [ |
267 | | - "# ── People ────────────────────────────────────────────────────────────────\n", |
| 239 | + "# \u2500\u2500 People \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", |
268 | 240 | "people = [\n", |
269 | 241 | " {\"name\": \"Alice Chen\", \"role\": \"ML Researcher\", \"org\": \"DeepMind\", \"field\": \"Reinforcement Learning\"},\n", |
270 | 242 | " {\"name\": \"Bob Torres\", \"role\": \"Staff Engineer\", \"org\": \"Google\", \"field\": \"Distributed Systems\"},\n", |
271 | 243 | " {\"name\": \"Carol Smith\", \"role\": \"Founder & CEO\", \"org\": \"Synthex\", \"field\": \"NLP\"},\n", |
272 | 244 | " {\"name\": \"David Park\", \"role\": \"Research Scientist\", \"org\": \"OpenAI\", \"field\": \"LLMs\"},\n", |
273 | | - " {\"name\": \"Eva Müller\", \"role\": \"Systems Architect\", \"org\": \"Synthex\", \"field\": \"Graph Databases\"},\n", |
| 245 | + " {\"name\": \"Eva M\u00fcller\", \"role\": \"Systems Architect\", \"org\": \"Synthex\", \"field\": \"Graph Databases\"},\n", |
274 | 246 | " {\"name\": \"Frank Liu\", \"role\": \"Principal Engineer\", \"org\": \"Meta\", \"field\": \"Graph ML\"},\n", |
275 | 247 | " {\"name\": \"Grace Okafor\", \"role\": \"PhD Researcher\", \"org\": \"MIT\", \"field\": \"Knowledge Graphs\"},\n", |
276 | 248 | " {\"name\": \"Henry Rossi\", \"role\": \"CTO\", \"org\": \"Synthex\", \"field\": \"Databases\"},\n", |
|
287 | 259 | "\n", |
288 | 260 | "print(f\"Created {len(people)} people\")\n", |
289 | 261 | "\n", |
290 | | - "# ── Companies ─────────────────────────────────────────────────────────────\n", |
| 262 | + "# \u2500\u2500 Companies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", |
291 | 263 | "companies = [\n", |
292 | 264 | " {\"name\": \"Google\", \"industry\": \"Technology\", \"founded\": 1998, \"hq\": \"Mountain View\"},\n", |
293 | 265 | " {\"name\": \"Meta\", \"industry\": \"Technology\", \"founded\": 2004, \"hq\": \"Menlo Park\"},\n", |
|
305 | 277 | "\n", |
306 | 278 | "print(f\"Created {len(companies)} companies\")\n", |
307 | 279 | "\n", |
308 | | - "# ── Technologies ──────────────────────────────────────────────────────────\n", |
| 280 | + "# \u2500\u2500 Technologies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", |
309 | 281 | "technologies = [\n", |
310 | 282 | " {\"name\": \"Transformer\", \"type\": \"Architecture\", \"year\": 2017},\n", |
311 | 283 | " {\"name\": \"Graph Neural Network\", \"type\": \"Algorithm\", \"year\": 2009},\n", |
|
328 | 300 | }, |
329 | 301 | { |
330 | 302 | "cell_type": "markdown", |
331 | | - "id": "a1b2c3d4-0000-0000-0000-000000000010", |
| 303 | + "id": "9", |
332 | 304 | "metadata": {}, |
333 | 305 | "source": [ |
334 | | - "## Step 3 — Create relationships" |
| 306 | + "## Step 3 \u2014 Create relationships" |
335 | 307 | ] |
336 | 308 | }, |
337 | 309 | { |
338 | 310 | "cell_type": "code", |
339 | 311 | "execution_count": null, |
340 | | - "id": "a1b2c3d4-0000-0000-0000-000000000011", |
341 | | - "metadata": { |
342 | | - "execution": { |
343 | | - "iopub.execute_input": "2026-04-19T10:04:07.058969Z", |
344 | | - "iopub.status.busy": "2026-04-19T10:04:07.058874Z", |
345 | | - "iopub.status.idle": "2026-04-19T10:04:07.100906Z", |
346 | | - "shell.execute_reply": "2026-04-19T10:04:07.100443Z" |
347 | | - } |
348 | | - }, |
| 312 | + "id": "10", |
| 313 | + "metadata": {}, |
349 | 314 | "outputs": [], |
350 | 315 | "source": [ |
351 | 316 | "edges = [\n", |
|
354 | 319 | " (\"Bob Torres\", \"WORKS_AT\", \"Google\", {}),\n", |
355 | 320 | " (\"Carol Smith\", \"WORKS_AT\", \"Synthex\", {\"since\": 2021}),\n", |
356 | 321 | " (\"David Park\", \"WORKS_AT\", \"OpenAI\", {}),\n", |
357 | | - " (\"Eva Müller\", \"WORKS_AT\", \"Synthex\", {\"since\": 2022}),\n", |
| 322 | + " (\"Eva M\u00fcller\", \"WORKS_AT\", \"Synthex\", {\"since\": 2022}),\n", |
358 | 323 | " (\"Frank Liu\", \"WORKS_AT\", \"Meta\", {}),\n", |
359 | 324 | " (\"Grace Okafor\", \"WORKS_AT\", \"MIT\", {}),\n", |
360 | 325 | " (\"Henry Rossi\", \"WORKS_AT\", \"Synthex\", {\"since\": 2021}),\n", |
|
369 | 334 | " (\"Carol Smith\", \"KNOWS\", \"Bob Torres\", {}),\n", |
370 | 335 | " (\"Grace Okafor\", \"KNOWS\", \"Alice Chen\", {}),\n", |
371 | 336 | " (\"Frank Liu\", \"KNOWS\", \"James Wright\", {}),\n", |
372 | | - " (\"Eva Müller\", \"KNOWS\", \"Grace Okafor\", {}),\n", |
| 337 | + " (\"Eva M\u00fcller\", \"KNOWS\", \"Grace Okafor\", {}),\n", |
373 | 338 | " # RESEARCHES / WORKS_ON\n", |
374 | 339 | " (\"Alice Chen\", \"RESEARCHES\", \"Reinforcement Learning\", {\"since\": 2019}),\n", |
375 | 340 | " (\"David Park\", \"RESEARCHES\", \"LLM\", {\"since\": 2020}),\n", |
|
424 | 389 | }, |
425 | 390 | { |
426 | 391 | "cell_type": "markdown", |
427 | | - "id": "a1b2c3d4-0000-0000-0000-000000000012", |
| 392 | + "id": "11", |
428 | 393 | "metadata": {}, |
429 | 394 | "source": [ |
430 | | - "## Step 4 — Verify" |
| 395 | + "## Step 4 \u2014 Verify" |
431 | 396 | ] |
432 | 397 | }, |
433 | 398 | { |
434 | 399 | "cell_type": "code", |
435 | 400 | "execution_count": null, |
436 | | - "id": "a1b2c3d4-0000-0000-0000-000000000013", |
437 | | - "metadata": { |
438 | | - "execution": { |
439 | | - "iopub.execute_input": "2026-04-19T10:04:07.102456Z", |
440 | | - "iopub.status.busy": "2026-04-19T10:04:07.102333Z", |
441 | | - "iopub.status.idle": "2026-04-19T10:04:07.110337Z", |
442 | | - "shell.execute_reply": "2026-04-19T10:04:07.109926Z" |
443 | | - } |
444 | | - }, |
| 401 | + "id": "12", |
| 402 | + "metadata": {}, |
445 | 403 | "outputs": [], |
446 | 404 | "source": [ |
447 | 405 | "from collections import Counter\n", |
|
468 | 426 | { |
469 | 427 | "cell_type": "code", |
470 | 428 | "execution_count": null, |
471 | | - "id": "a1b2c3d4-0000-0000-0000-000000000014", |
472 | | - "metadata": { |
473 | | - "execution": { |
474 | | - "iopub.execute_input": "2026-04-19T10:04:07.112104Z", |
475 | | - "iopub.status.busy": "2026-04-19T10:04:07.111970Z", |
476 | | - "iopub.status.idle": "2026-04-19T10:04:07.118744Z", |
477 | | - "shell.execute_reply": "2026-04-19T10:04:07.118356Z" |
478 | | - } |
479 | | - }, |
| 429 | + "id": "13", |
| 430 | + "metadata": {}, |
480 | 431 | "outputs": [], |
481 | 432 | "source": [ |
482 | 433 | "print(\"=== Who works at Synthex? ===\")\n", |
|
486 | 437 | " params={\"co\": \"Synthex\", \"tag\": DEMO_TAG},\n", |
487 | 438 | ")\n", |
488 | 439 | "for r in rows:\n", |
489 | | - " print(f\" {r['name']} — {r['role']}\")\n", |
| 440 | + " print(f\" {r['name']} \u2014 {r['role']}\")\n", |
490 | 441 | "\n", |
491 | 442 | "print(\"\\n=== What does Synthex use? ===\")\n", |
492 | 443 | "rows = client.cypher(\n", |
|
502 | 453 | " params={\"tech\": \"GraphRAG\", \"tag\": DEMO_TAG},\n", |
503 | 454 | ")\n", |
504 | 455 | "for r in rows:\n", |
505 | | - " print(f\" → {r['dependency']}\")\n", |
| 456 | + " print(f\" \u2192 {r['dependency']}\")\n", |
506 | 457 | "\n", |
507 | | - "print(\"\\n✓ Demo data seeded.\")\n", |
508 | | - "print(\"To query it from notebooks 01–03, connect them to the same CoordiNode server (COORDINODE_ADDR).\")\n", |
| 458 | + "print(\"\\n\u2713 Demo data seeded.\")\n", |
| 459 | + "print(\"To query it from notebooks 01\u201303, connect them to the same CoordiNode server (COORDINODE_ADDR).\")\n", |
509 | 460 | "client.close()" |
510 | 461 | ] |
511 | 462 | } |
|
517 | 468 | "name": "python3" |
518 | 469 | }, |
519 | 470 | "language_info": { |
520 | | - "codemirror_mode": { |
521 | | - "name": "ipython", |
522 | | - "version": 3 |
523 | | - }, |
524 | | - "file_extension": ".py", |
525 | | - "mimetype": "text/x-python", |
526 | | - "name": "python", |
527 | | - "nbconvert_exporter": "python", |
528 | | - "pygments_lexer": "ipython3", |
529 | | - "version": "3.11.9" |
| 471 | + "name": "python" |
530 | 472 | } |
531 | 473 | }, |
532 | 474 | "nbformat": 4, |
|
0 commit comments