NodeJSを使用したExcelからTurtleへ

ほとんどの人が組織のデータについて考えるとき、巨大なリレーショナルデータベースにテラバイトのデータがある大きなサーバーファームを想像するでしょう。それでも、その組織内の驚くべき(さらには邪魔な)量のメタデータはそこに保存されていない可能性がありますが、Microsoft Excelまたはその多くの派生物で長年にわたって作成(および維持)されています。これは、通常、セマンティックトリプルストアとメタデータハブが理想的に適している情報でもあります—統制語彙、データディクショナリ、要約分析など。

ただし、Excelをデータソースとして使用すると、p r の問題が発生します。 Excelブックは、本質的にはワークシートのブックであり、それ自体がグリッドです。スプレッドシートの作成者がアドホックな方法で自分自身を割り当てたときどきあいまいなデザインを超えて、そこには継承構造も実際のスキーマもありません。つまり、Excelスプレッドシートをオントロジー担当者または取り込みエンジニアに渡した場合、その構造を所定の位置に丸呑みするために押すことができる魔法のボタンはありません。構造は法医学的に解決されなければなりません。つまり、このようにExcelを使用する場合は、事前にそのような順序を課す必要があります。

トリプルとしてのセル

セマンティクスの観点から、このようなスプレッドシートをRDFデータに変換するために実行できる2つのアプローチがあります。最初に、コンテンツを含むすべてのセルを見つけてから、スプレッドシート、行、列に基づいてセルの場所を反映するURLを作成します。

たとえば、myData.xls(または同様の拡張子)というスプレッドシートがある場合、「MySpreadsheet」のセル[B5](値は「JaneDoe」)は、次のトリプルとして指定されます(タートル):

これは、スプレッドシートの構造がまばらで非常に明確に指定されている場合、実際には悪いアプローチではありませんが、その構造が存在し、推測できる場合を除いて、多くの場合、わずかな見返りで多くの作業が必要になります。 Excelがデータの入力フォームとして使用される場合、またはアルゴリズムで生成され(場合によってはレポートとして)、特定の構造がほとんどわかっている場合が最適なユースケースです。ただし、スプレッドシートの大きなメリットの1つである、ワークシートとテーブルの関連付けを利用する方がよい場合がよくあります。

表としてのワークシート

かなりの期間データを扱う人なら誰でも、テーブルがテーブルであることに気付くでしょう。テーブルをコンマ区切り値(CSV、実際にはコンマだけで区切る必要はありません)ドキュメントとして表すことができます。この場合、最初の行には区切りフィールド名が含まれ、2行目以降には区切り行の値が含まれます。

リレーショナルデータベースは、フィールド名をフィールド位置のプロキシとして使用して、ほぼ同じことを行います(これは、特定の行に対して、その行の値のフィールド位置でもあります)。ほとんどのデータベースは、特定のフィールドのデータ型表現やストレージ容量などを管理するためのいくつかのスケマティックメタデータ(スキーマ定義またはDDL)も提供します。テーブルにも名前があります。

CSVとしてのExcelワークシートも同じように機能します。最初の行にはフィールド名が含まれ、後続の行にはフィールド位置に関連付けられた値が含まれます。主な違いは、テーブル名がワークシート名に置き換えられ、データベースがワークブックに対応することです。

興味深いのは、これと同じ対応がRDFでも発生することです。 RDFは正規化されたデータ言語です—これは、すべての階層がフラットテーブルに分解されていることを意味します。最も単純なケースでは、これは、リレーショナルデータベース、スプレッドシート、およびトリプルのセット間で1対1の対応を行うことができることも意味します。後者の唯一の注意点は、グローバルIDキーの生成に注意する必要があることです。 (URIまたはIRI)表形式の情報から導き出すことができます。

これは、現在の記事で採用するアプローチです。

NPCの説明

私は若い頃、熱心なロールプレイゲーマー(そして当然のことながらダンジョンマスター)であり、想像力を働かせる機会だけでなく、ダンジョンズアンドドラゴンズ、チャンピオンズ、ガープスなどのゲームに惹かれていました。また、本の中には非常に多くのクールなテーブルがあり、データオタクの子供として、それはオタクの頂点でした。結果として、RPGがデータモデリングと構造を紹介するための私の「頼りになる」例になったことはおそらく驚くことではありません。主な理由は、RPGは興味深いほど複雑ですが、混乱するほど複雑ではなく、会ったことがないからです。バッククローゼットのどこかにお気に入りのRPGキャラクターシートが1枚も浮かんでいないプログラマー。

そこで、アイデアを説明するために(そしていくつかのデータから始めるために)、Game.xlsxというExcelワークブックを作成し、サンプル文字の任意のセットをレイアウトしました。フォーマットを簡単にするために、これを以下の複数のテーブルに分割しました:

これは包括的ではないことに注意してください。むしろ、トリプルを作成する際のさまざまなパターンを紹介するだけで十分です。

上記の表の内訳は偶然ではありません。すべての場合の名前は、ゲートの外では一意であると見なされます。つまり、キーの基礎として機能することができます。外部で収集されたデータセットの場合、これは必ずしも安全な仮定ではないことに注意してください。複数の人が同じ名前を持っている可能性があるため、一意の識別子を作成するために他のキー(個別または組み合わせ)を処理する必要がある場合があります。

キー(および最終的にはURI)を生成する手法はさまざまですが、ここに示す例では、npc idは、通常、名前から空白やその他の句読点を圧縮することにより、名前属性に最適です。したがって、「Mara GlynisDottir」は、URIキー npc:_MaraGlynisDottir を生成します。ここで注意する価値があるのは、生成されるものはデータベースの直接的な1対1の表現ではなく、概念的な表現であるため、識別しようとするのではなく、概念的な名前空間を指定できることです。与えられたシステムデータベース。ただし、システム識別子(ここでは、スプレッドシートである可能性があるシステム125)に基づいてnpcに基づいてURIを作成することを検討している場合は、次のようになります。

ここで覚えておくべき重要な点は、キーをグローバルにユニバーサルに作成できるようにすることです。システム125とシステム130にそれぞれMaraGlynisdottirがある場合、同じである可能性が最も高いことが証明されるまで、それらは別個のエンティティとして扱われる必要があります(この記事の範囲外)。

関連付けはスプレッドシートで頻繁に発生し、通常、キーではなく名前として指定されます。これらは通常、統制語彙またはカテゴリ用語としてよく考えられるものに分類されます。たとえば、性別には4つの潜在的なカテゴリ用語(ここでは、「男性」、「女性」、「両性具有」、「該当なし」)があり、それぞれが性別の語彙に関連付けられています。これは、性別専用のテーブル、種用のテーブルなどを作成できる一方で、これらがすべて同じ関連特性のセットを持つすべての用語であるという事実は、2つのテーブルを作成する方がよいことを示唆しています。 1つは語彙用、もう1つは用語用です。

スプレッドシートの例では、これは、それぞれのタブ名として用語とVocabsを使用してさらに2つのワークシートを作成することによって行われました。

用語ワークシートの2番目の列は、Vocabワークシートの語彙名です。これらの各テーブルから作成されたキーが相互に、およびNPCテーブルと整合性があることを保証できる限り、これらを主キー/外部キーリンクに変換できるはずです。ここでの完全な例では、7つの語彙にわたって80の用語を定義していますが、実際のアプリケーションでは、これらのテーブルが数十から数百になり、分類カテゴリが数万になる可能性があります。エンティティ(NPCなど)はファセットと対応する属性(名前やスコアなど)の組み合わせであると考えることができるため、このようなカテゴリまたは関連付けはファセットと考えることもできます。

一方、属性は一般にアトミック値(文字列、数値、日付、科学者がスカラーと呼ぶもの)です。属性を定義する方法は少なくとも2つありました。 1つ目は、特定のプロパティ(強度や知性など)としてのものでした。これらは次のようにモデル化される可能性があります:

各属性に特定のプロパティ(または述語)がある場合、または次のようにモデル化されている可能性がある場合:

述語(npc:hasAttribute)が1つだけで、次に値と関連するタイプがある場合。

さらにアプリケーションユーティリティのため、属性の場合は最初の形式が好まれました(たとえば、通常は特定の属性値を比較します)。 cibstryctただし、これの欠点は、属性が特定のスカラーではなく、より複雑な構造である場合、別のアプローチを使用する必要があることです。モデリングの観点から、特定の属性述語とそれに関連付けられたタイプの間に関連付けを作成できます。

述語 npc:hasStrength は、 npc:hasAttribute のサブクラスではありません。前者はデータプロパティであり、後者はオブジェクトプロパティであるためです。しかし、それらの間には関係があります。

より広大な形がコインで使用されます。ゲームには、ペニー(基本的に肉体労働者が1日の労働で稼ぐ賃金)に基づいて、5種類の通貨があります。コインには一般化された値(デフォルトのプロパティ値で示されます)があり、最小の通貨(ファージング)は12分の1ペニー(約1時間分の労働)であり、それを超えるすべての単位は12倍大きくなります。したがって、個人の総資産は、各タイプのコインの数にそのタイプのデフォルト値を掛けることによって決定できます。これはSPARQLを使用して実行できる計算であり、ゲームの成功を判断するための1つのメトリックであるため、その場で計算できることは理にかなっています。 25 Solad 14 Lunad 3 Crescentは、5 * 123 + 14 * 122+ 3 * 12、つまり10,693ペニーで計算されます。ゲームの世界では、予想されるように、ほとんどの農民は一般的にSoladsをあまり頻繁に見ませんでした。

各コインコレクションは、財布で表されます(つまり、1つはソラド用、もう1つはルナ用など)。財布は次のように表されます:

そして各npcのすべての財布の合計は次のように計算できます(SPARQL):

Excelドキュメント内で作成する必要がある最後のテーブルは、「名前空間」テーブルです。このテーブルは、プレフィックスと名前空間および説明を一致させます:

両方がTurtle / Sparqlに焦点を合わせていることを意図して。最初のケースでは、名前空間がローカルで識別されることを保証できるため、追加の構成ファイルは必要ありません。さらに、これらはタートル生成ファイルと、名前空間に関するSHACL情報をデータセットに追加するための両方で使用されます。

インジェスターの作成

これのほとんどは、Excelドキュメントの作成に時間を費やすことに焦点を当てています。ただし、その作業が完了すると、実際の変換は、私のお気に入りの2つのツール(テンプレートリテラルとnode.jsベースのXLSX.jsモジュール)で処理できます。後者の便利なツールには、3つのバージョンがあります。かなり強力なコミュニティバージョン(無料でオープンソース)と、Excelドキュメントのフォーマットを改善できる2つの強力なエンタープライズバージョンです。ここで生成するサンプルコードは、コミュニティバージョンを利用しています。

XSLXファイルを含むバージョンのシンプルなインジェスターがgitにあります。

このインジェスターは汎用ではありません。プロセスがどのように機能するかを示すことのみを目的としています。私は サービスとして実行されるより一般化されたインジェスターに取り組んでおり、前進するにつれてGitHubノートにその情報を含めます。

ファイルindex.jsには、関連するJavascriptコードが含まれています:

関数 compactToken()は文字列を受け取り、句読点を削除して、文字列のコンパクトな(スペースのない)キャメルケースバージョンを生成します。これは主にURIの生成を支援するために使用されます。

xlsx オブジェクトには、Excelドキュメントを読み込んで、内部で一連のJavascriptオブジェクトに変換するためのサポートが含まれています。基本オブジェクトは完全なワークブックの表現ですが、配列 workbook.Sheets [] を使用して名前付きシートを取得できます。

このセクションの後に続くのは、同じコードのバージョンを効果的に繰り返すことです。最初のセクションでは、配列から「名前空間」ワークシートを取得し、ユーティリティ関数を使用して、これをオブジェクトの配列に変換します。最初の行の名前を各オブジェクトのプロパティ名として使用します(つまり、 、

次に、各行を処理するためのテンプレートリテラルが作成されます。

作成されると、アプリケーションは配列を反復処理し、各ノード(行)をTurtleプレフィックス宣言にマップします。

2番目のセクションは、タートルプレフィックス宣言を生成するのではなく、同じリソースに対してSHACL宣言を作成することを除いて、同様のことを行います。

その後のセクションでは、語彙宣言が生成され、その後に用語の定義が続きます。

最後のセクションでは、最も複雑なオブジェクトであるNPCを生成します。 Javascriptは、関連付けへのマッピング(前のセクションで最初に定義されたURIへの接続)の両方を処理し、次に関連付けを作成し、最後に通貨を処理します。

フラグメント識別子を使用すると、事前定義されたリスト(属性リストなど)を反復処理して、サブジェクトやオブジェクトだけでなく、 npc:hasStrength などの述語も生成できることに注意してください。これにより、出力が作成されます:

この例では、これはコンソールログに出力されます。コンソールで実行するには、次のように入力します。

または、出力を保持してテキストプロセッサで表示する場合は、次のように実行します。

概要

これは、テンプレートリテラルの使用や、特定の形式/ターゲットを念頭に置いてExcelを設計することの重要性などの基本的な概念を説明することを目的としています。私はこれのより一般化されたバージョンに取り組んでおり、パラメーター化された形式またはサービスとして実行でき、基本的なユースケースの管理(変更なしのストレートマップの実行)とオーバーライドの両方にかなり自明のヒューリスティックを使用しますヘルパーモジュールを使用した特定の機能。さらに、Turtleが最優先されますが、時間の経過とともに範囲をほとんどのRDF形式に拡張する予定です。

カートケーグルは作家であり、情報アーキテクトであり、一般的なニーズもあります。彼はワシントン州イサクアに住んでいて、猫と一緒に雨が降るのを見ています。