Entity Node は GEUL ストリームで個体(人物、場所、事物、組織、概念など)を識別する固定長4ワード(64ビット)パケットである。

SIDX の本質

特性説明
Non-unique同じ SIDX に複数の個体が対応可能
Multi-SIDX一つの個体が複数の SIDX を持てる(時点/役割別)
ビット = 意味ビット位置そのものが属性を表す
抽象/具体の連続Mode と Attributes の充填度で区分

例:

  • トランプ(不動産事業家)→ SIDX_A
  • トランプ(大統領)→ SIDX_B(異なる SIDX)
  • “Human + Male + Korea” → 抽象的な「韓国人男性」
  • “Human + Male + Korea + 1946 + Business + …” → ほぼ特定の人物

設計原則

Q識別子の内蔵を放棄:

  • 全ビットを純粋な意味整列に投資
  • WMS SIMD フィルタリング性能の最大化
  • Q識別子はトリプルで別途接続:(Entity_SIDX, P-外部ID, "Q12345")

Serial ビット不要:

  • WMS クエリは2段階:SIMD で範囲を絞る → 範囲内でディテール確認
  • Serial は意味のない数字なので SIMD に貢献しない
  • そのビットを意味整列に投資すれば第1段階でさらに絞れる

ビットレイアウト(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登録個体織田信長、トヨタ、BTS
1001特定単数「あの人」
2010特定少数「その数人」
3011特定多数「あの人たち」
4100全称「すべての~」
5101存在「ある~」
6110不特定「誰でも~」
7111総称「~一般」

登録個体(Mode=0)

  • ウィキデータ Q識別子、WordNet Synset など外部 ID とマッピングされた個体
  • Q識別子自体はトリプルで接続:(Entity_SIDX, P-外部ID, "Q12345")
  • 数(Number)概念とは無関係:トヨタは「一つ」だが単数と言うには微妙、BTS はグループだが一つの個体

代名詞/抽象(Mode=1~7)

  • EntityType + Attributes で意味範囲を指定
  • ビットが埋まるほど具体的
  • 例:Human(Type) + Male(Attr) + Japan(Attr) = 「日本人男性」

EntityType(6ビット = 64種)

ウィキデータ P31(instance of)頻度統計に基づき64種の上位タイプを配定する。詳細分類は 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 ごとに異なる意味で解釈されるタイプ別可変スキーマである。高頻度属性により多くのビットを割り当て、WMS SIMD フィルタリングに直接活用する。

Human (0x00) Attributes

┌──────────┬────────┬────────┬──────┬────────┬────────┬─────────┬──────────┬────────────┬──────────┐
│ サブ分類 │ 職業   │ 国籍   │ 時代 │ 10年代 │ 性別   │ 著名度  │ 言語     │ 出生地域   │ 活動分野 │
│  5bit    │  6bit  │  8bit  │ 4bit │  4bit  │  2bit  │  3bit   │  6bit    │   6bit     │   4bit   │
└──────────┴────────┴────────┴──────┴────────┴────────┴─────────┴──────────┴────────────┴──────────┘
offset:  0        5       11      19     23      27      29        32         38          44

Star (0x0C) Attributes

┌────────────┬────────────┬──────────┬──────────┬────────┬────────┬──────────┬──────────┬────────┬────────┐
│ 星座       │ スペクトル │ 光度階級 │ 見かけ   │ 赤経   │ 赤緯   │ フラグ   │ 視線速度 │ 赤方偏移│ 視差   │
│   7bit     │    4bit    │   3bit   │  4bit    │  4bit  │  4bit  │   6bit   │   5bit   │  5bit  │  4bit  │
└────────────┴────────────┴──────────┴──────────┴────────┴────────┴──────────┴──────────┴────────┴────────┘

フラグビット定義:

  • bit0: IR(赤外線源)
  • bit1: Radio(電波源)
  • bit2: X-ray(X線源)
  • 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
    }

登録個体:織田信長

# 織田信長 (Q178713)
oda_nobunaga = make_entity(
    mode=0,              # 登録個体
    entity_type=0x00,    # Human
    attrs=(
        (0x06 << 43) |   # サブ分類: Military
        (0x01 << 37) |   # 職業: Warlord
        (0x52 << 29) |   # 国籍: Japan
        (0x5 << 25) |    # 時代: Early Modern
        (0x0 << 21) |    # 10年代: 1530s
        (0x01 << 19) |   # 性別: Male
        (0x7 << 16)      # 著名度: 1000+
    )
)
# Q識別子接続: Triple(oda_nobunaga_SIDX, P-外部ID, "Q178713")

抽象:「すべての日本人男性」

all_japanese_men = make_entity(
    mode=4,              # 全称(すべて)
    entity_type=0x00,    # Human
    attrs=(
        (0x52 << 29) |   # 国籍: Japan
        (0x01 << 19)     # 性別: Male
    )
)

下位タイプマッピング

ウィキデータの多くのタイプが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

カバレッジ

項目数値
ウィキデータ全個体117,419,925
Wikimedia 内部(除外)8,565,353 (7.3%)
SIDX 対象108,854,572 (92.7%)
64タイプ直接カバー36,295,074 (33.3%)
下位タイプ吸収71,842,429 (66.0%)
Other フォールバック717,069 (0.7%)
最終カバレッジ100%
衝突率< 0.01%

Q識別子接続

Entity Node は Q識別子を内蔵せず、トリプルエッジで別途接続する。

Subject:  Entity_SIDX (64ビット)
Property: P-外部ID (例: P-Wikidata)
Object:   "Q12345" (文字列または整数)