Theographic Bible Metadata
- 授權
- CC BY-SA 4.0
- 來源
- robertrouse/theographic-bible-metadata
預先 join 好的「人–地–事–經文」關係圖譜,目前唯一可用的開源事件資料源。已下載全部 8 個 JSON 檔:
| 檔案 | 筆數 | 大小 |
|---|---|---|
| people.json | 3,067 | 4.9 MB |
| places.json | 1,274 | 2.3 MB |
| events.json | 450 | 1.7 MB |
| verses.json | 31,102 | 36 MB ⚠ |
| books.json | 66 | 1.2 MB |
| chapters.json | 1,189 | 1.8 MB |
| peopleGroups.json | 23 | 43 KB |
| easton.json | 6,519 | 6.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,頂層結構固定為:
{
"id": "recXXXXXXXXXXXXXX",
"createdTime": "2018-03-19T00:26:39.000Z",
"fields": { /* 該筆資料的所有欄位 */ }
}createdTime 為 Airtable 自動記錄的建立時間,通常不需使用。fields 才是實際資料。
id 是 record 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 欄位,值為 publish 或 wip(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_1、abda_4),流水號是資料集內部消歧義序號,同名不同人時依序遞增,數字本身無意義。
people.json 包含 God、Holy Spirit、Satan——slug 分別為 god_1324、holy_spirit_7400、satan_2476。這是資料集的設計選擇,顯示層可自行決定是否過濾或另行分類。
minYear / maxYear 是該人物出現經節的年份範圍(整數,BC 為負),可快速過濾時期。timeline 連結到相關 event record,用於時間軸視覺化。dictionaryText 為 Easton 字典原始 HTML(僅 121 筆有值);dictText 為 Markdown 版本(1,816 筆有值),直接渲染用。
{
"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 / longitude;recogitoStatus 多數為 UNVERIFIED,表示未人工校驗。
{
"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 為負字串)、持續時間(duration:7D、40Y、3M 等)、參與人物與涵蓋經節,均以 record ID 引用。
sortKey 是浮點數時間軸排序鍵,可直接排序,不需重新解析字串。verseSort 是第一節的 verseID(如 01001001),做字串排序的備選。people (from verses) 是 Airtable 自動產生的 lookup 欄位,非去重,使用前需 Set 去重。
{
"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)、book、chapter(所屬書卷與章 record ID),以及年份(yearNum,整數,BC 為負)。
標注並非全覆蓋,31,102 節中的實際覆蓋率:
| yearNum | 90% | 27,993 節 |
| people | 53% | 16,513 節 |
| event | 50% | 15,619 節 |
| places | 15% | 4,811 節 — 地點標注最不完整 |
osisRef 格式:採 OSIS 標準書卷縮寫,格式為 BookAbbrev.Chapter.Verse(如 Gen.2.8)。 書卷縮寫如 Gen、Exod、1Chr、Matt、Rev,與 OSIS 規範一致(非 SBL 縮寫)。
verseID 是固定 8 位零填補數字:前 2 位書卷序號、中間 3 位章序號、後 3 位節序號。 例如 01002008 = 創世記(01)第 2 章(002)第 8 節(008)。可直接做字串排序;events 的 verseSort 也是同一格式。
richText 是內嵌 Markdown 超連結的經文(人名連到 /person/slug);mdText 格式類似但部分連結有 bug([( 缺少閉括號),使用以 richText 為準。
{
"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。
{
"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。
{
"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 資料。
{
"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/placeLookuprecord IDunmatched— 未對應到任何人物或地點(主題詞、神學術語等)
itemNum 用於消歧義(如「Abdon 4」的 itemNum 為 4);dictText 已轉為 Markdown 格式,可直接渲染。
// 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 - 所有名稱為英文,中文化需另建名稱對照