Turtlex & MintArchivist
MintArchivist MintArchivist
Привет, Черепаха, я тут пробовал визуализировать историю коммитов в публичных репозиториях в виде графа, и подумал, что можно сделать живой архив, который будет помечать, индексировать и автоматически обобщать все open-source вклады. Поможешь с дизайном структуры данных и движка для обхода репозиториев?
Turtlex Turtlex
Звучит безумно, но мне нравится хаос живого графа. Для схемы представь узлы как коммиты, рёбра – как отношения родитель/потомок, а подграф "тэги" для тем, языков и, возможно, тональности. Метаданные храни в маленьком JSON-блоке на каждом узле, но тяжёлые данные – во вторичном индексе, чтобы запросы были быстрыми. Для краулера – двухэтапный подход: 1. Используем GraphQL API GitHub, чтобы быстро получить дерево, кэшируя список SHA коммитов каждого репозитория. 2. Запускаем пул воркеров, которые по запросу получают диффы, разбирают их на символы и добавляют новые узлы в граф. Необходимо агрессивно ограничивать скорость запросов, чтобы не превысить лимиты; может, токеновый бакет на каждого пользователя. Также, легковесный Bloom-фильтр в памяти может избежать повторной обработки одних и тех же коммитов. К какой базе данных ты склоняешься? Графовая БД типа Neo4j для обхода графа или колоночная база данных типа ClickHouse, если нужны аналитические запросы на лету? Дай знать, и я набросаю более конкретный план.
MintArchivist MintArchivist
Привет, Я всё больше склоняюсь к Neo4j, потому что это решение заточено под обход графов – нам нужно отслеживать, как один коммит распространяется по веткам, форкам и языкам. Column store мог бы пригодиться для аналитики, но мы всегда можем добавить его, если понадобятся пакетные отчёты. Схема должна быть лаконичной: узел коммита с SHA, автором, датой, JSON-объектом и связями на родительские коммиты. Подграф с тегами может быть отдельным типом узла, связанным через "classified_as". Идея с bloom filter – отличная, она спасёт нас от утопления в дубликатах. Давай прототипируем двухфазный краулер и посмотрим, как будет расти граф. И не забудь про версионирование схемы, я терпеть не могу, когда она начинает "плыть".
Turtlex Turtlex
Отлично, Neo4j делает обход данных приятным. Я начну с минимального файла схемы и зафиксирую версию с помощью git-тэгов – иначе будет просто кошмар с дрифтом схемы. Для краулера я напишу простой пул рабочих процессов, который будет получать список коммитов через GraphQL, кэшировать списки SHA в Redis, а затем будет передавать изменения (diffs) через пул потоков, который будет разбирать и отправлять узлы/связи в Neo4j. Bloom-фильтр будет храниться в памяти для каждого репозитория, чтобы мы никогда не переставляли коммиты в очередь. Как только у нас будет несколько тысяч коммитов, мы сможем протестировать глубину графа и подкорректировать индексацию. Отправлю тебе черновик завтра. Просто дай мне твой список репозиториев и любые конкретные тэги, которые ты хочешь, чтобы я добавил изначально.
MintArchivist MintArchivist
Звучит неплохо. Вот репозитории для первой партии: - torvalds/linux - microsoft/vscode - tensorflow/tensorflow - apache/commons-lang3 - nodejs/node По тегам предварительно заложим: - languages: c, c++, javascript, python, go - topics: kernel, editor, machine-learning, utilities, runtime - sentiment: neutral, positive, negative (основываясь на тональности сообщений коммитов) Дай мне граф, как мы и договаривались, и я начну создавать индекс. Удачи с bloom filter; просто помни, его нужно сбрасывать каждый раз, когда переключаешь репозитории.