Entity Node — это фиксированный 4-словный (64-бит) пакет в потоке GEUL, идентифицирующий сущности (людей, места, объекты, организации, концепции и т.д.).

Сущность SIDX

СвойствоОписание
Non-uniqueОдин SIDX может соответствовать нескольким сущностям
Multi-SIDXОдна сущность может иметь несколько SIDX (по времени/роли)
Бит = значениеПозиция бита сама по себе обозначает атрибут
Абстрактное/конкретное — непрерывный спектрРазличается степенью заполнения Mode и Attributes

Примеры:

  • Трамп (бизнесмен) → SIDX_A
  • Трамп (президент) → SIDX_B (другой SIDX)
  • «Human + Male + Korea» → абстрактное «корейский мужчина»
  • «Human + Male + Korea + 1946 + Business + …» → почти конкретная личность

Принципы проектирования

Отказ от встроенного Q-ID:

  • Все биты инвестируются в чистое семантическое выравнивание
  • Максимальная производительность SIMD-фильтрации WMS
  • Q-ID связывается отдельно через Triple Edge: (Entity_SIDX, P-внешнийID, "Q12345")

Serial-биты не нужны:

  • Запросы WMS двухэтапные: сужение через SIMD → детальная проверка внутри диапазона
  • Serial — бессмысленное число, не помогающее SIMD
  • Инвестирование этих бит в семантическое выравнивание сужает диапазон на первом этапе

Битовая раскладка (4 слова = 64 бита)

1st WORD (16 бит)
┌─────────┬──────┬────────────┐
│ Prefix  │ Mode │ EntityType │
│  7bit   │ 3bit │   6bit     │
└─────────┴──────┴────────────┘

2nd WORD (16 бит)
┌─────────────────────────────┐
│     Attributes старшие 16 бит│
└─────────────────────────────┘

3rd WORD (16 бит)
┌─────────────────────────────┐
│     Attributes средние 16 бит│
└─────────────────────────────┘

4th WORD (16 бит)
┌─────────────────────────────┐
│     Attributes младшие 16 бит│
└─────────────────────────────┘
ПолеБитыРазмерОписание
Prefix1-770001001 (Entity Node)
Mode8-1038 режимов квантификации/числа
EntityType11-16664 верхних типа
Attributes17-6448Переменная схема по типу

Mode (3 бита)

Mode объединяет квантификацию (Quantification) и число (Number) сущности в 3 битах.

КодДвоич.ЗначениеПример
0000Зарегистрированная сущностьПётр I, Samsung, BTS
1001Определённое единственное«тот человек»
2010Определённое малое«те несколько»
3011Определённое множественное«те люди»
4100Универсальная квантификация«все ~»
5101Экзистенциальная«некий ~»
6110Неопределённая«любой ~»
7111Родовая«~ вообще»

Зарегистрированная сущность (Mode=0)

  • Сущности, сопоставленные с внешними ID: Wikidata Q-ID, WordNet Synset и др.
  • Q-ID связывается через Triple: (Entity_SIDX, P-внешнийID, "Q12345")
  • Не связано с понятием числа: Samsung — «один», но не единственное; BTS — группа, но одна сущность

Местоимения/абстракции (Mode=1~7)

  • Семантический диапазон задаётся через EntityType + Attributes
  • Чем больше бит заполнено, тем конкретнее
  • Пример: Human(Type) + Male(Attr) + Korea(Attr) = «корейский мужчина»

EntityType (6 бит = 64 типа)

64 верхних типа назначаются на основе частотной статистики Wikidata P31 (instance of). Детализация обрабатывается через биты подклассов в Attributes.

ДиапазонКатегорияКол-воПримеры типов
0x00-0x07Биология/персоны8Human, Taxon, Gene, Protein
0x08-0x0BХимия/вещества4Chemical, Compound, Mineral, Drug
0x0C-0x13Небесные тела8Star, Galaxy, Asteroid, Planet
0x14-0x1BЛандшафт/природа8Mountain, River, Lake, Island
0x1C-0x23Населённые пункты/админ.8Settlement, Village, Street, Park
0x24-0x2BЗдания/сооружения8Building, Church, School, Bridge
0x2C-0x2FОрганизации4Organization, Business, PoliticalParty
0x30-0x3BПроизведения12Painting, Document, Film, Album
0x3C-0x3FСобытия/прочее4SportsSeason, Event, Election, Other

Таблица кодов (все 64)

КодТипQ-IDКол-во
0x00HumanQ512.5M
0x01TaxonQ165213.8M
0x02GeneQ71871.2M
0x03ProteinQ80541.0M
0x04CellLineQ21014462154K
0x05FamilyNameQ101352662K
0x06GivenNameQ202444128K
0x07FictionalCharacterQ1563261798K
0x08ChemicalQ1131451711.3M
0x09CompoundQ111731.1M
0x0AMineralQ794662K
0x0BDrugQ1214045K
0x0CStarQ5233.6M
0x0DGalaxyQ3182.1M
0x0EAsteroidQ3863249K
0x0FQuasarQ83373178K
0x10PlanetQ63415K
0x11NebulaQ120578K
0x12StarClusterQ1688455K
0x13MoonQ25373K
0x14MountainQ8502518K
0x15HillQ54050321K
0x16RiverQ4022427K
0x17LakeQ23397292K
0x18StreamQ47521194K
0x19IslandQ23442153K
0x1ABayQ3959425K
0x1BCaveQ3550920K
0x1CSettlementQ486972580K
0x1DVillageQ532245K
0x1EHamletQ5084148K
0x1FStreetQ79007711K
0x20CemeteryQ39614298K
0x21AdminRegionQ15284100K
0x22ParkQ2269845K
0x23ProtectedAreaQ47397235K
0x24BuildingQ41176292K
0x25ChurchQ16970286K
0x26SchoolQ9842242K
0x27HouseQ3947235K
0x28StructureQ811979216K
0x29SportsVenueQ1076486145K
0x2ACastleQ2341342K
0x2BBridgeQ1228038K
0x2COrganizationQ43229531K
0x2DBusinessQ4830453242K
0x2EPoliticalPartyQ727835K
0x2FSportsTeamQ84701795K
0x30PaintingQ33052131.1M
0x31DocumentQ4984845M
0x32LiteraryWorkQ7725634395K
0x33FilmQ11424335K
0x34AlbumQ482994303K
0x35MusicalWorkQ105543609195K
0x36TVEpisodeQ21191270177K
0x37VideoGameQ7889172K
0x38TVSeriesQ539842685K
0x39PatentQ43305660289K
0x3ASoftwareQ739713K
0x3BWebsiteQ3512712K
0x3CSportsSeasonQ27020041183K
0x3DEventQ165668210K
0x3EElectionQ4023111K
0x3FOther-Для расширения

Attributes (48 бит)

Переменная схема по типу, интерпретируемая по-разному для каждого EntityType. Высокочастотным атрибутам выделяется больше бит. Напрямую используется в SIMD-фильтрации WMS.

Атрибуты Human (0x00)

┌──────────┬────────┬────────┬──────┬────────┬────────┬─────────┬──────────┬────────────┬──────────┐
│ Подкласс │Профес. │Гражд.  │ Эпоха│Декада  │  Пол   │Извест.  │  Язык    │Регион рожд.│Сфера деят│
│  5bit    │  6bit  │  8bit  │ 4bit │  4bit  │  2bit  │  3bit   │  6bit    │   6bit     │   4bit   │
└──────────┴────────┴────────┴──────┴────────┴────────┴─────────┴──────────┴────────────┴──────────┘
offset:  0        5       11      19     23      27      29        32         38          44

Атрибуты Star (0x0C)

┌────────────┬────────────┬──────────┬──────────┬────────┬────────┬──────────┬──────────┬────────┬────────┐
│Созвездие   │Спектр. тип │Класс свет│Видимая зв│Прямое в│Склонен.│  Флаги   │Луч. скор.│Красн.см│Параллак│
│   7bit     │    4bit    │   3bit   │  4bit    │  4bit  │  4bit  │   6bit   │   5bit   │  5bit  │  4bit  │
└────────────┴────────────┴──────────┴──────────┴────────┴────────┴──────────┴──────────┴────────┴────────┘

Определение флаговых бит:

  • bit0: IR (инфракрасный источник)
  • bit1: Radio (радиоисточник)
  • bit2: X-ray (рентгеновский источник)
  • bit3: Binary (двойная звезда)
  • bit4: Variable (переменная звезда)
  • bit5: HighPM (собственное движение)

Операции

Создание Entity

def make_entity(
    mode: int,           # 3 бита
    entity_type: int,    # 6 бит
    attrs: int           # 48 бит
) -> bytes:
    PREFIX = 0b0001001   # 7 бит (Entity Node)

    word1 = (PREFIX << 9) | (mode << 6) | entity_type
    word2 = (attrs >> 32) & 0xFFFF
    word3 = (attrs >> 16) & 0xFFFF
    word4 = attrs & 0xFFFF

    return (
        word1.to_bytes(2, 'big') +
        word2.to_bytes(2, 'big') +
        word3.to_bytes(2, 'big') +
        word4.to_bytes(2, 'big')
    )

Разбор Entity

def parse_entity(data: bytes) -> dict:
    word1 = int.from_bytes(data[0:2], 'big')
    word2 = int.from_bytes(data[2:4], 'big')
    word3 = int.from_bytes(data[4:6], 'big')
    word4 = int.from_bytes(data[6:8], 'big')

    prefix = (word1 >> 9) & 0x7F
    mode = (word1 >> 6) & 0x7
    entity_type = word1 & 0x3F
    attrs = (word2 << 32) | (word3 << 16) | word4

    return {
        'prefix': prefix,
        'mode': mode,
        'entity_type': entity_type,
        'attrs': attrs
    }

Примеры

Зарегистрированная сущность: Суворов

# Суворов (Q131149)
suvorov = make_entity(
    mode=0,              # Зарегистрированная сущность
    entity_type=0x00,    # Human
    attrs=(
        (0x06 << 43) |   # Подкласс: Military
        (0x01 << 37) |   # Профессия: General
        (0x52 << 29) |   # Гражданство: Russia
        (0x5 << 25) |    # Эпоха: Early Modern
        (0x0 << 21) |    # Декада: 1730s
        (0x01 << 19) |   # Пол: Male
        (0x7 << 16)      # Известность: 1000+
    )
)
# Связь Q-ID: Triple(suvorov_SIDX, P-внешнийID, "Q131149")

Абстракция: «все русские мужчины»

all_russian_men = make_entity(
    mode=4,              # Универсальная (все)
    entity_type=0x00,    # Human
    attrs=(
        (0x52 << 29) |   # Гражданство: Russia
        (0x01 << 19)     # Пол: Male
    )
)

Сопоставление подтипов

Многие типы Wikidata являются подтипами 64 EntityType. Кодировщик маршрутизирует значение P31 в соответствующий верхний тип.

Подтип (P31)Верхний типКол-во
Q13442814 (scholarly article)Document (0x31)45.2M
Q67206691 (infrared source)Star (0x0C)2.6M
Q13100073 (village of China)Village (0x1D)592K

Покрытие

ПоказательЗначение
Всего сущностей Wikidata117 419 925
Внутренние Wikimedia (исключены)8 565 353 (7.3%)
Целевые SIDX108 854 572 (92.7%)
Прямое покрытие 64 типами36 295 074 (33.3%)
Поглощение подтипов71 842 429 (66.0%)
Фолбэк Other717 069 (0.7%)
Итоговое покрытие100%
Коллизии< 0.01%

Связь Q-ID

Entity Node не содержит Q-ID внутри, а связывается через Triple Edge.

Subject:  Entity_SIDX (64 бита)
Property: P-внешнийID (напр. P-Wikidata)
Object:   "Q12345" (строка или число)