My Bible

Theographic Bible Metadata

授權
CC BY-SA 4.0
來源
robertrouse/theographic-bible-metadata

預先 join 好的「人–地–事–經文」關係圖譜,目前唯一可用的開源事件資料源。已下載全部 8 個 JSON 檔:

檔案筆數大小
people.json3,0674.9 MB
places.json1,2742.3 MB
events.json4501.7 MB
verses.json31,10236 MB
books.json661.2 MB
chapters.json1,1891.8 MB
peopleGroups.json2343 KB
easton.json6,5196.0 MB

⚠ verses.json 36 MB 不適合在瀏覽器端直接載入;應在 server 端預處理或建立索引後按需查詢。 people.json 4.9 MB 偏大是因為 1,816 筆 record 內嵌了 Easton 字典全文(dictText 欄位)。

檔案關聯圖

八個檔案之間的引用關係如下。箭頭表示「欄位值是另一個檔案的 record ID」。

資料格式背景

這份資料集的原始形態是 Airtable 資料庫。Airtable 是一種雲端試算表/關聯資料庫工具——你可以把它想成「有關聯功能的 Google Sheets」,每張試算表是一個資料表(如 people、places),資料表之間可以互相引用。作者將整份資料庫匯出(export)成 JSON,即得到這些檔案。

匯出後,每筆資料(即原本的每一列)稱為一個 record,頂層結構固定為:

(所有檔案通用)JSON
{
  "id": "recXXXXXXXXXXXXXX",
  "createdTime": "2018-03-19T00:26:39.000Z",
  "fields": { /* 該筆資料的所有欄位 */ }
}

createdTime 為 Airtable 自動記錄的建立時間,通常不需使用。fields 才是實際資料。

idrecord ID——Airtable 為每一列自動產生的唯一識別碼,格式為 rec 開頭加 14 個英數字元(如 recv0dAY2ULzJ687g)。 它的作用相當於關聯資料庫的外鍵:當 people.json 某人的 birthPlace 值為 ["recfrXyxhuYOczKTm"], 意思是「出生地是 places.json 裡 id 等於 recfrXyxhuYOczKTm 的那筆地點」。 使用時需自行建立 id → record 的 Map,再用 record ID 做 lookup(join)。

status 欄位:people / places / verses 都有 status 欄位,值為 publishwip(work in progress)。wip 才是絕大多數——people 有 2,781 筆(91%)是 wip、verses 有 26,311 筆(85%)是 wip。 按 publish 過濾會損失 85–90% 的資料,建議直接使用全部資料,忽略此欄位。

people.json — 3,067 筆

人物資料。除基本的性別、生卒年(BC 為負字串)之外,含完整家族關係欄位(father / mother / siblings / children / partners,均為 record ID 陣列)、所屬族群(memberOf)、出生/死亡地(birthPlace / deathPlace),以及所有出現節的 record ID 陣列。

slug 格式為「名字小寫 + 底線 + 流水號」(如 aaron_1abda_4),流水號是資料集內部消歧義序號,同名不同人時依序遞增,數字本身無意義。

people.json 包含 God、Holy Spirit、Satan——slug 分別為 god_1324holy_spirit_7400satan_2476。這是資料集的設計選擇,顯示層可自行決定是否過濾或另行分類。

minYear / maxYear 是該人物出現經節的年份範圍(整數,BC 為負),可快速過濾時期。timeline 連結到相關 event record,用於時間軸視覺化。dictionaryText 為 Easton 字典原始 HTML(僅 121 筆有值);dictText 為 Markdown 版本(1,816 筆有值),直接渲染用。

people.jsonJSON
{
  "id": "recv0dAY2ULzJ687g",
  "fields": {
    "slug": "aaron_1",
    "name": "Aaron",
    "gender": "Male",
    "birthYear": "-1574",
    "deathYear": "-1451",
    "minYear": -1700,
    "maxYear": 64,
    "father": ["recPXtuWYdjyghv7R"],
    "mother": ["recxqmePpZGwvUF06"],
    "siblings": ["recvZksoA0NmFrYZ7", "recjNRR60PAuFtjha"],
    "children": ["rec2LyU5fsvL5DWDi", "recyDlo13a3T5DDGh", "..."],
    "partners": ["rec7jlnTi8vIXmZyO"],
    "memberOf": ["recuYvXjZsXumRLPL"],
    "birthPlace": ["recfrXyxhuYOczKTm"],
    "deathPlace": ["recn5ad7qKvkUdCyZ"],
    "verseCount": 331,
    "verses": ["rec9zZSdb798FoFX8", "..."],
    "eastons": ["recQNbmhvjXqt0wHQ"],
    "dictText": ["The eldest son of Amram and Jochebed..."],
    "timeline": ["recjkmUO88wihv8Ci", "recr71Fz4NHTnGLJ2"],
    "status": "wip"
  }
}

family 欄位均為 record ID,需反查 people.json 自身。memberOf → peopleGroups.json;birthPlace/deathPlace → places.json。

places.json — 1,274 筆

地點資料。含 KJV/ESV 名稱、地形大類(featureType:Water / Region / City / Landmark / Mountain / Island / Valley / Path)與小類(featureSubType,如 River)。

座標有兩個來源,均保留:openBibleLat / openBibleLong(來自 OpenBible Geocoding)和 recogitoLat / recogitoLon(來自 Recogito 人工標記,同時附 recogitoUri / recogitoLabel / recogitoUID)。 最終合併結果存在 latitude / longituderecogitoStatus 多數為 UNVERIFIED,表示未人工校驗。

places.jsonJSON
{
  "id": "recirTpwii9yXJ9JM",
  "fields": {
    "slug": "abana_1",
    "kjvName": "Abana",
    "esvName": "Abana",
    "comment": "Now Barada River",
    "featureType": "Water",
    "featureSubType": "River",
    "openBibleLat": "33.545097",
    "openBibleLong": "36.224661",
    "recogitoLat": "33.545097",
    "recogitoLon": "36.224661",
    "recogitoUri": "http://sws.geonames.org/752926",
    "recogitoLabel": "Nahr Barada",
    "recogitoStatus": "UNVERIFIED",
    "latitude": "33.545097",
    "longitude": "36.224661",
    "verseCount": 1,
    "verses": ["recAGvWEECNhgEmy5"],
    "eastons": ["recYQ8wPiafNfXc4k"],
    "status": "wip"
  }
}

openBibleLat/Long 與 recogitoLat/Lon 為原始來源座標;latitude/longitude 為合併後使用座標。

events.json — 450 筆(舊約為主)

事件資料。每筆含事件標題、開始年份(startDate,BC 為負字串)、持續時間(duration7D40Y3M 等)、參與人物與涵蓋經節,均以 record ID 引用。

sortKey 是浮點數時間軸排序鍵,可直接排序,不需重新解析字串。verseSort 是第一節的 verseID(如 01001001),做字串排序的備選。people (from verses) 是 Airtable 自動產生的 lookup 欄位,非去重,使用前需 Set 去重。

events.jsonJSON
{
  "id": "recOIPcFaPCjMpQ6w",
  "fields": {
    "eventID": 1,
    "title": "Creation of all things",
    "startDate": "-4003",
    "duration": "7D",
    "sortKey": -4002.98998999,
    "verseSort": "01001001",
    "participants": ["reccZB8SVU5bEMcgo", "recgkFqZovgbr3pAi", "..."],
    "verses": ["rec7mkRLwey2ntUG9", "rec7DRaTJV5ANnvEj", "..."],
    "people (from verses)": ["reccZB8SVU5bEMcgo", "reccZB8SVU5bEMcgo", "..."]
  }
}

duration 單位:D(天)、M(月)、Y(年)。sortKey 為浮點時間軸鍵,直接可排序。新約覆蓋不完整。

verses.json — 31,102 筆 · 36 MB

經節資料(KJV 原文)。每節標注涉及的 people(人物 record ID 陣列)、places(地點 record ID 陣列)、event(事件 record ID)、bookchapter(所屬書卷與章 record ID),以及年份(yearNum,整數,BC 為負)。

標注並非全覆蓋,31,102 節中的實際覆蓋率:

yearNum90%27,993 節
people53%16,513 節
event50%15,619 節
places15%4,811 節 — 地點標注最不完整

osisRef 格式:採 OSIS 標準書卷縮寫,格式為 BookAbbrev.Chapter.Verse(如 Gen.2.8)。 書卷縮寫如 GenExod1ChrMattRev,與 OSIS 規範一致(非 SBL 縮寫)。

verseID 是固定 8 位零填補數字:前 2 位書卷序號、中間 3 位章序號、後 3 位節序號。 例如 01002008 = 創世記(01)第 2 章(002)第 8 節(008)。可直接做字串排序;events 的 verseSort 也是同一格式。

richText 是內嵌 Markdown 超連結的經文(人名連到 /person/slug);mdText 格式類似但部分連結有 bug([( 缺少閉括號),使用以 richText 為準。

verses.jsonJSON
{
  "id": "recmb6LrwBeHu6MJK",
  "fields": {
    "osisRef": "Gen.2.8",
    "verseID": "01002008",
    "verseNum": "8",
    "verseText": "And the LORD God planted a garden eastward in Eden...",
    "yearNum": -4004,
    "people": ["reccZB8SVU5bEMcgo"],
    "places": ["recLIUK6VRKNjnGo6"],
    "event": ["recTU3ZxG7zQ61N9d"],
    "book": ["recIFusdNl6d8dj3L"],
    "chapter": ["recParAnlMHJy8vSQ"],
    "peopleCount": 1,
    "placesCount": 1,
    "richText": "And the [LORD](/person/god_1324) [God](/person/god_1324) planted a garden...",
    "status": "wip"
  }
}

yearNum 為整數;peopleCount/placesCount 是預算好的計數,不必展開陣列。

books.json — 66 筆

書卷後設資料。testament 區分舊約/新約;bookDiv 細分十類(Pentateuch / Historical / Poetry-Wisdom / Major Prophets / Minor Prophets / Gospels / Acts / Pauline Epistles / General Epistles / Revelation)。verseCount / peopleCount / placeCount 是預算好的計數。

注意:writers 欄位存的是 person 的 slug 字串(如 moses_2108),而非 record ID——這是 Airtable lookup 欄位的行為,它回傳連結 record 的文字欄位值而非 id。要查對應的 person record,需用 people.find(p => p.fields.slug === writer),而非比對 id

books.jsonJSON
{
  "id": "recIFusdNl6d8dj3L",
  "fields": {
    "osisName": "Gen",
    "bookName": "Genesis",
    "shortName": "Ge",
    "slug": "gen",
    "bookOrder": 1,
    "testament": "Old Testament",
    "bookDiv": "Pentateuch",
    "chapterCount": 50,
    "verseCount": 1533,
    "peopleCount": 168,
    "placeCount": 119,
    "writers": ["moses_2108"],
    "chapters": ["recRAcqtgn28zXm1a", "..."],
    "verses": ["rec7mkRLwey2ntUG9", "..."]
  }
}

verses/chapters 陣列數量大,一般只用 osisName、bookDiv、testament 做索引。writers 是 slug,不是 record ID(見上方說明)。

chapters.json — 1,189 筆

章後設資料。osisRef 格式為 BookAbbrev.Chapter(如 1Chr.1),與 verses.osisRef 相同規範但無節號。writer(注意:單數,與 books.writers 不同)存的是 record ID,詩篇各篇有標注,其餘多為空。 含預算計數 peopleCount / placesCount

chapters.jsonJSON
{
  "id": "recRAcqtgn28zXm1a",
  "fields": {
    "osisRef": "1Chr.1",
    "slug": "1chr-1",
    "book": ["rec2ZFQHqI4eUjhqX"],
    "chapterNum": 1,
    "writer": ["recKCifIYcTXovrF4"],
    "peopleCount": 212,
    "placesCount": 14,
    "verses": ["recIJ14BlamQIvokW", "..."]
  }
}

writer 是 record ID(可反查 people.json id),books.writers 則是 slug——兩個欄位型別不同。

peopleGroups.json — 23 筆

族群/支派資料,覆蓋範圍有限(僅 23 個群體,以支派為主)。欄位只有族群名稱與成員的 person record ID 陣列,以及實驗性的 events_dev(部分族群有關聯事件 record ID,屬開發中欄位,不保證完整)。族群本身無年代或描述,需從 members 展開後取 people.json 資料。

peopleGroups.jsonJSON
{
  "id": "recuYvXjZsXumRLPL",
  "fields": {
    "groupName": "Tribe of Levi",
    "members": ["recv0dAY2ULzJ687g", "recCkdqG3oAlsPbjr", "..."],
    "events_dev": ["recjkmUO88wihv8Ci", "recr71Fz4NHTnGLJ2", "..."]
  }
}

events_dev 為開發中欄位,不穩定。

easton.json — 6,519 筆

Easton's Bible Dictionary(1897,公共領域)條目資料,每筆含英文定義與相關經文引用(OSIS 超連結)。條目已與 people.json / places.json 做初步對應,matchType 有四個值:

  • person — 對應到一個人物
  • place — 對應到一個地點
  • multi — 同名多個實體(如「Abdon」可能是人或地),matchSlugs 含候選列表,同時附 personLookup / placeLookup record ID
  • unmatched — 未對應到任何人物或地點(主題詞、神學術語等)

itemNum 用於消歧義(如「Abdon 4」的 itemNum 為 4);dictText 已轉為 Markdown 格式,可直接渲染。

easton.jsonJSON
// matchType: "person"
{
  "id": "recQNbmhvjXqt0wHQ",
  "fields": {
    "termLabel": "Aaron",
    "matchType": "person",
    "matchSlugs": "aaron_1",
    "dictText": "The eldest son of Amram and Jochebed ([Ex. 6:20](/exod#Exod.6.20))..."
  }
}

// matchType: "multi"
{
  "id": "recoeKZq3dxVIkGSU",
  "fields": {
    "termLabel": "Abdon",
    "itemNum": 4,
    "matchType": "multi",
    "matchSlugs": "['abdon_3', 'abdon_11']",
    "personLookup": ["recJoOUIhbhMXSf5Y"],
    "placeLookup": ["recPdJgyI1kRUNw35"],
    "dictText": "One of the sons of Shashak ([1 Chr. 8:23](/1chr#1Chr.8.23))..."
  }
}

matchSlugs 在 multi 型別中為 Python list 格式字串('[...]'),需額外 parse。

已知缺口

  • 上游無 periods.json;時期資料需自建
  • 新約 yearNum 覆蓋不完整(資料集作者仍進行中),events.json 450 筆以舊約為主
  • peopleGroups 僅 23 筆,大量族群未收錄
  • books.writers 是 slug 而非 record ID(見 books.json 小節),與其他引用欄位不一致
  • easton.json matchSlugs 在 multi 型別中為 Python list 格式字串,需額外 parse
  • 所有名稱為英文,中文化需另建名稱對照