---
cssclasses:
  - hide-properties
tags:
  - aiassist
modified: 20260405 16:00
created: 20260405 16:00
---

## Статистика хранилища

```dataviewjs
// === Данные ===
const allPages = dv.pages()
  .where(p => !p.file.path.startsWith("Файлы/"))
  .where(p => !p.file.path.startsWith("Шаблоны/"))
  .where(p => !p.file.path.startsWith("Базы/"))
  .where(p => !p.file.path.startsWith(".obsidian/"))
  .where(p => !p.file.path.startsWith("Бонус/"));

const N = allPages.length;
const outlinks = allPages.flatMap(p => p.file.outlinks).length;
const inlinks = allPages.flatMap(p => p.file.inlinks).length;
const E = Math.round((outlinks + inlinks) / 2);
const density = N > 1 ? (2 * E) / (N * (N - 1)) : 0;
const avgDegree = N > 0 ? (2 * E) / N : 0;
const orphans = allPages.filter(p => p.file.outlinks.length === 0 && p.file.inlinks.length === 0).length;
const orphanPct = N > 0 ? ((orphans / N) * 100).toFixed(1) : 0;

// Все теги
const allTags = new Set();
allPages.forEach(p => {
  if (p.file.tags) p.file.tags.forEach(t => allTags.add(t));
});

// === Достижение PKM ===
let achievement, nextLevel, progress;
if (N < 25) { achievement = "🌰 Seed — семечко посажено"; nextLevel = 25; }
else if (N < 50) { achievement = "🌱 Sprout — первые ростки"; nextLevel = 50; }
else if (N < 100) { achievement = "📝 Note Hoarder — фаза сбора"; nextLevel = 100; }
else if (N < 200) { achievement = "🔗 Link Discoverer — связи появляются"; nextLevel = 200; }
else if (N < 350) { achievement = "🧩 Pattern Seeker — паттерны проявляются"; nextLevel = 350; }
else if (N < 500) { achievement = "🗺️ Map Maker — карты знаний"; nextLevel = 500; }
else if (N < 750) { achievement = "🌿 Digital Gardener — выращиваю идеи"; nextLevel = 750; }
else if (N < 1000) { achievement = "📚 Commonplace Scholar — учёный-эрудит"; nextLevel = 1000; }
else if (N < 1500) { achievement = "🏗️ System Builder — система крепнет"; nextLevel = 1500; }
else if (N < 2500) { achievement = "🧠 Second Brain — второй мозг"; nextLevel = 2500; }
else if (N < 4000) { achievement = "🃏 Zettelkasten Practitioner — путь Лумана"; nextLevel = 4000; }
else if (N < 6000) { achievement = "⚡ Idea Machine — режим синтеза"; nextLevel = 6000; }
else if (N < 8000) { achievement = "✍️ Prolific Writer — уровень Холидея"; nextLevel = 8000; }
else if (N < 10000) { achievement = "📖 Knowledge Publisher — публикую из заметок"; nextLevel = 10000; }
else if (N < 15000) { achievement = "🎓 Luhmann's Disciple — серьёзный масштаб"; nextLevel = 15000; }
else if (N < 20000) { achievement = "🏛️ Living Library — живая библиотека"; nextLevel = 20000; }
else { achievement = "🌌 Exocortex Master — трансцендентная система"; nextLevel = null; }

// === Статистика по папкам ===
const folderCounts = {};
allPages.forEach(p => {
  const folder = p.file.folder || "/";
  const topFolder = folder === "/" ? "/" : folder.split("/")[0];
  folderCounts[topFolder] = (folderCounts[topFolder] || 0) + 1;
});
const sortedFolders = Object.entries(folderCounts).sort((a, b) => b[1] - a[1]);

// === Статусы графа ===
const densityStatus = density < 0.005 ? "⚠️ разреженный" : density > 0.1 ? "⚠️ переплетённый" : "✅ здоровый";
const degreeStatus = avgDegree < 2 ? "⚠️ мало связей" : avgDegree > 15 ? "⚠️ хабы доминируют" : "✅ сбалансированный";
const orphanStatus = (orphans / N) < 0.1 ? "✅ чисто" : (orphans / N) < 0.25 ? "⚠️ есть шум" : "🔴 много сирот";

// === Топ связанных заметок ===
const topConnected = allPages
  .sort(p => -(p.file.outlinks.length + p.file.inlinks.length))
  .slice(0, 10);

// === РЕНДЕР ===

// 1. Уровень достижения
const progressText = nextLevel ? ` → до следующего уровня: **${nextLevel - N}** заметок` : "";
dv.paragraph(`> [!success] Уровень PKM\n> **${achievement}**${progressText}`);

// 2. Общие показатели
dv.paragraph(`> [!abstract] Общие показатели\n> 📝 **${N}** заметок　·　🔗 **${E}** связей　·　🏷️ **${allTags.size}** тегов　·　🏝️ **${orphans}** сирот (${orphanPct}%)`);

// 3. Граф-аналитика
dv.header(4, "Граф-аналитика");
dv.table(
  ["Метрика", "Значение", "Статус"],
  [
    ["Плотность графа", density.toFixed(4), densityStatus],
    ["Средняя степень связности", avgDegree.toFixed(2), degreeStatus],
    ["Сироты (без связей)", `${orphans} из ${N} (${orphanPct}%)`, orphanStatus],
    ["Исходящих ссылок", outlinks, "—"],
    ["Входящих ссылок", inlinks, "—"],
  ]
);

// 4. Заметки по папкам
dv.header(4, "Заметки по папкам");
dv.table(
  ["Папка", "Кол-во", "Доля"],
  sortedFolders.map(([folder, count]) => [
    folder,
    count,
    (count / N * 100).toFixed(1) + "%"
  ])
);

// 5. Топ-10 связанных заметок
dv.header(4, "Топ-10 самых связанных заметок");
dv.table(
  ["Заметка", "← Входящие", "→ Исходящие", "Всего"],
  topConnected.map(p => [
    p.file.link,
    p.file.inlinks.length,
    p.file.outlinks.length,
    p.file.inlinks.length + p.file.outlinks.length
  ])
);
```
