(57)【要約】      （修正有）【課題】構造データを返すような一般的なAPIを持つアプリケーションにも適用できる、RDFの生成技法を提供する。【解決手段】コンピュータ・プログラミング言語、例えばJava(R)のクラスに付与したアノテーションよるルールを再帰的に遅延評価することで、アプリケーションのオブジェクト集合の取得とユーザ定義クラスのオブジェクトへの変換、さらにRDFへの変換を行う。この処理においては、URIを解析し、ルートクラス名とAPIのパラメータを得て、ルートクラスのオブジェクトを一つ生成し、オブジェクトのクラスのアノテーションのうちで、外部アプリケーションAPIとパラメータを指定するものを抽出してAPI呼び出しを構成して実行することでデータを取得する。【選択図】図５
2014235631.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータの処理により、URIをRDF表現に変換する方法であって、
URIを受け取るステップと、
前記URIを解析して、ルートクラス名と、APIのパラメータを取得するステップと、
前記ルートクラス名に基づき、プログラムのアノテーション付きクラス定義により、ルートクラスのオブジェクトを生成するステップと、
前記ルートクラスのアノテーションに従いAPIを呼び出し、データを取得するステップと、
前記アノテーションに従って前記データから前記プログラムのオブジェクトを生成して、ローカル変数をセットするステップと、
前記生成したオブジェクトのクラスのアノテーションにAPIを指定するコードが含まれているかどうか判断し、もしそうなら前記アノテーションに従いAPIを呼び出し、データを取得するステップに戻る、ステップと、
前記生成したオブジェクトのクラスのアノテーションにAPIを指定するコードが含まれていないなら、前記アノテーションに従って、前記プログラムのオブジェクトからRDF表現を生成するステップを有する、
方法。
【請求項２】
前記プログラムが、クラスとメソッドにアノテーションが付加できるクラスベースのプログラム言語で書かれたものである、請求項１に記載の方法。
【請求項３】
前記プログラムがJava(R)である、請求項２に記載の方法。
【請求項４】
前記RDF表現を生成するステップは、クライアント・コンピュータ上で実行され、前記APIによるデータ取得は、前記クライアント・コンピュータと異なるサーバから取得される、請求項１に記載の方法。
【請求項５】
コンピュータの処理により、URIをRDF表現に変換するプログラムであって、
前記コンピュータに、
URIを受け取るステップと、
前記URIを解析して、ルートクラス名と、APIのパラメータを取得するステップと、
前記ルートクラス名に基づき、プログラムのアノテーション付きクラス定義により、ルートクラスのオブジェクトを生成するステップと、
前記ルートクラスのアノテーションに従いAPIを呼び出し、データを取得するステップと、
前記アノテーションに従って前記データから前記プログラムのオブジェクトを生成して、ローカル変数をセットするステップと、
前記生成したオブジェクトのクラスのアノテーションにAPIを指定するコードが含まれているかどうか判断し、もしそうなら前記アノテーションに従いAPIを呼び出し、データを取得するステップに戻る、ステップと、
前記生成したオブジェクトのクラスのアノテーションにAPIを指定するコードが含まれていないなら、前記アノテーションに従って、前記プログラムのオブジェクトからRDF表現を生成するステップを実行させる、
プログラム。
【請求項６】
前記プログラムが、クラスとメソッドにアノテーションが付加できるクラスベースのプログラム言語で書かれたものである、請求項５に記載のプログラム。
【請求項７】
前記プログラムがJava(R)である、請求項６に記載のプログラム。
【請求項８】
前記RDF表現を生成するステップは、クライアント・コンピュータ上で実行され、前記APIによるデータ取得は、前記クライアント・コンピュータと異なるサーバから取得される、請求項５に記載のプログラム。
【請求項９】
コンピュータの処理により、URIをRDF表現に変換するシステムであって、
記憶手段と、
前記記憶手段に保存された、プログラムのアノテーション付きクラス定義のデータと、
URIを受け取る手段と、
前記URIを解析して、ルートクラス名と、APIのパラメータを取得する手段と、
前記ルートクラス名に基づき、前記プログラムのアノテーション付きクラス定義により、ルートクラスのオブジェクトを生成する手段と、
前記ルートクラスのアノテーションに従いAPIを呼び出し、データを取得する手段と、
前記アノテーションに従って前記データから前記プログラムのオブジェクトを生成して、ローカル変数をセットする手段と、
前記生成したオブジェクトのクラスのアノテーションにAPIを指定するコードが含まれているかどうか判断し、もしそうなら前記アノテーションに従いAPIを呼び出し、データを取得するステップに戻る、手段と、
前記生成したオブジェクトのクラスのアノテーションにAPIを指定するコードが含まれていないなら、前記アノテーションに従って、前記プログラムのオブジェクトからRDF表現を生成する手段を有する、
システム。
【請求項１０】
前記プログラムが、クラスとメソッドにアノテーションが付加できるクラスベースのプログラム言語で書かれたものである、請求項９に記載のシステム。
【請求項１１】
前記プログラムがJava(R)である、請求項１０に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータの処理により、所定のデータからRDF表現を生成するための技法に関するものである。
【背景技術】
【０００２】
近年、特開２００５−２４２９３４号公報、あるいは特開２００６−３０２０８５号公報に記載されているように、ウェブ上にあるリソースを記述する仕組みとして、RDF(Resource Description Framework)形式が採用されている。また、Christian Bizer, Tom Heath, Tim Berners-Lee, Linked Data-The Story So Far, International Journal on Semantic Web and Information Systems, 5(3), 2009には、RDF形式のデータをウェブの仕組みの上で連携させて使用するLinked Dataが、グローバルな情報公開の仕組みとして記述されている。さらに、Open Services for Lifecycle Collaboration (OSLC), http://open-services.net/には、企業内の情報連携としてLinked Dataを活用することが記述されている。
【０００３】
Linked Dataを提供するツールには、RDFデータを格納しておいて提供するツールと、既存ツールが管理する、RDFになっていないデータをRDFに変換して提供するツールがある。
【０００４】
また、Linked Dataを使用するツールには、ユーザ要求に従ってリンクを辿ってデータを得るツールと、データ・アクセスの効率化のために、予めLinked Data提供ツールをクロールしてインデックスを作成しておくツールとがある。
【０００５】
図１は、このようなツールを利用するための、複数のコンピュータをネットワーク接続した構成の例を示す図である。すなわち、典型的にはＬＡＮまたはＷＡＮであるネットワーク１０２には、コンピュータ１０４、１０６、１０８、１１０、１１２、１１４、１１６、及び１１８が接続されている。コンピュータ１０４とコンピュータ１１０にはRDFデータを格納しておいて提供するツールが格納されている。
【０００６】
コンピュータ１１６には、ユーザ要求に従ってリンクを辿ってデータを得るツールが格納されている。コンピュータ１１８には、データ・アクセスの効率化のために、予めLinked Data提供ツールをクロールしてインデックスを作成しておくツールが格納されている。
【０００７】
さて、図１に示すように、多数のアプリケーションをLinked Dataに対応させるためには、各アプリケーションのオブジェクトを、RDFとして変換する必要がある。
【０００８】
このため知られている従来技術の１つとして、図２に概要を示す構成がある。このような構成では、オブジェクト・レポジトリ２０２の全体が一括して静的にRDF２０４に変換され、Linked Data使用ツール２０６からのURI２０８による問い合わせに応答して、この構成は、対応するRDF２１０を返す。しかし、このような構成では、オブジェクト・レポジトリ２０２の一部でも更新があると、オブジェクト・レポジトリ２０２の全体のRDF２０４への変換をやり直す必要があるので、非効率であった。
【０００９】
そこで、これを改良する従来技術として、図３に示す構成が知られている。このような構成では、Linked Data使用ツール３０２からURI３０４を受け取って、API呼び出し３０６を行い、オブジェクト・レポジトリ３０８にアクセスするコード３１０が存在する。そして、このようなコード３１０の働きにより、オブジェクト・レポジトリ３０８からオブジェクト３１２が抽出され、RDF変換器３１４はマッピング・ファイル３１６を参照して、RDF３１８を生成し、Linked Data使用ツール３０２に渡す。なお、このようなAPI呼び出し３０６は例えば、http://jena.sourceforge.net/tutorial/RDF_API/に記述がある。また、マッピング・ファイルとは、RDF変換の依存関係や階層などのルールを規定するファイルである。しかし、このような構成では、RDFの仕様が変わって、必要なオブジェクトが変更になると、必然的にレポジトリにアクセスするためのコード３１０を変更する必要がある。このとき、オブジェクトのプロパティの数が多いなど、オブジェクトが複雑であると、コード３１０の変更にバグが入り込みやすいなどの問題がある。
【００１０】
本願出願人に係る特願２０１２−１６２０３０号明細書に記載されている技術は、上記従来技術の改良に係るものであって、Linked Data使用ツールなどからURIを受け取り、URIからシードとなるオブジェクトを特定し、次に、そのオブジェクトの型から適切なマッピング・ファイルを特定し、そこから（部分）型情報を生成し、生成した型情報を参照して、シードから再帰的にたどってオブジェクトを収集し、次にシステムは、収集したオブジェクトのグラフをRDF変換器に渡し、RDF変換器は、マッピング・ファイルを参照して、オブジェクトのグラフをRDFに変換して出力する技法を記述する。しかし、この技法の制約として、データがオブジェクトとそのプロパティ値として個々に直接アクセスできる細粒度のアプリケーション・プログラミング・インタフェース(API)を仮定していて、構造データを一度に返すような一般的なAPIを持つアプリケーションには対応していないということがあった。すなわち、API呼出・結果解釈とマッピングの仕組みが一体化しているため、たとえば値を集計する、条件で選択する、値を再フォーマットするなどのデータ処理を、あらかじめ定義して固定された範囲でしか行えない。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２００５−２４２９３４号公報
【特許文献２】特開２００６−３０２０８５号公報
【特許文献３】特願２０１２−１６２０３０号明細書
【非特許文献】
【００１２】
【非特許文献１】Christian Bizer, Tom Heath, Tim Berners-Lee, Lined Data-The Story So Far, International Journal on Semantic Web and Information Systems, 5(3), 2009
【非特許文献２】Open Services for Lifecycle Collaboration (OSLC), http://open-services.net/
【非特許文献３】http://jena.sourceforge.net/tutorial/RDF_API/
【発明の概要】
【発明が解決しようとする課題】
【００１３】
従って、この発明の目的は、構造データを返すような一般的なAPIを持つアプリケーションにも適用できる、RDFの生成技法を提供することにある。
【課題を解決するための手段】
【００１４】
この発明は、コンピュータ・プログラミング言語のクラスに付与したアノテーションよるルールを再帰的に遅延評価することで、アプリケーションのオブジェクト集合の取得とユーザ定義クラスのオブジェクトへの変換、さらにRDFへの変換を行うことにより、上記課題を解決する。
【００１５】
ここで使用される好適なコンピュータ・プログラミング言語はJava(R)であり、アノテーションは、Java(R)のクラスに付与されるアノテーションである。この発明において、アノテーションは、次の３つの目的に使われる。
−  言語要素に対応して呼び出す外部アプリケーションのAPIとパラメータを指定する。
−  APIで取得したアプリケーションのデータからJava(R)オブジェクトへの対応付けを指定する。
−  Java(R)オブジェクトからRDF表現への対応付けを指定する。
【００１６】
この発明に従うシステムは、RDF表現を生成するために、以下のステップを実行する。
・受け取ったURIを解析し、ルートクラス名とAPIのパラメータを得るステップ。
・ルートクラスのオブジェクトを一つ生成するステップ。
・オブジェクトのクラスのアノテーションのうちで、外部アプリケーションAPIとパラメータを指定するものを抽出してAPI呼び出しを構成し、それを実行してデータを取得するステップ。
・オブジェクトのクラスのアノテーションのうちで、アプリケーションのデータからJavaオブジェクトへの対応付けを指定するものを抽出して、それにしたがって必要に応じてオブジェクトを生成してローカル変数をセットするステップ。このとき、生成したオブジェクトのクラスのアノテーションに外部アプリケーションAPIを指定するものがある場合、データを取得するステップに戻る。
・生成したオブジェクトに対して、そのクラスのオブジェクトからRDFへの対応付けのアノテーションにしたがってRDF表現を生成するステップ。
【発明の効果】
【００１７】
この発明によれば、APIで取得したアプリケーションのデータに対して、構造体はJavaオブジェクトに、テーブルはオブジェクトの配列に、ツリー状データは複合オブジェクトに対応付けるなどで、さまざまな形態のデータに対応することができる。
【００１８】
また、ローカル変数をセットするsetterメソッドの本体を、値を集計する、条件で選択する、値を再フォーマットするなどの、プログラミング言語による任意のデータ処理に置き換えることができる。
【００１９】
さらに、アプリケーション特有のAPIについて依存性を分離してデータの対応を記述できるようにすることで、必要に応じてプログラム言語によるデータ処理をマッピングの途中に自由に挿入することができる。
【図面の簡単な説明】
【００２０】
【図１】Linked Data変換／提供ツールと、Linked Data使用ツールを含む、ネットワーク接続された複数のコンピュータからなるシステム構成の概要図である。
【図２】URIに対応してRDFを提供するための従来技術を示す図である。
【図３】URIに対応してRDFを提供するための別の従来技術を示す図である。
【図４】本発明を実施するためのハードウェア構成のブロック図である。
【図５】本発明を実施するための機能要素のブロック図である。
【図６】本発明のRDF表現生成プログラムの処理のフローチャートを示す図である。
【図７】クライアント・コンピュータからのAPIによるデータ要求に対して、サーバからデータが送られる様子を示す図である。
【図８】動作例における、ルートクラスのオブジェクトを示す図である。
【図９】サーバから取得したデータの構造を示す図である。
【図１０】生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１１】生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１２】生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１３】別の処理例での、ルートクラスのオブジェクトを示す図である。
【図１４】別の処理例での、生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１５】別の処理例での、生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１６】別の処理例での、生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１７】別の処理例での、生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１８】別の処理例での、生成された、階層付けられたクラスのオブジェクトを示す図である。
【図１９】別の処理例での、生成された、階層付けられたクラスのオブジェクトを示す図である。
【発明を実施するための形態】
【００２１】
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
【００２２】
図４は、本発明を実施するためのコンピュータのハードウェアの一例を示すブロック図である。図４の構成は、クライアント・コンピュータ４００と、ネットワーク４２０と、ネットワーク４２０を介してクライアント・コンピュータ４００と接続されたサーバ４３０とからなる。
【００２３】
クライアント・コンピュータ４００において、システム・バス４０２には、ＣＰＵ４０４と、主記憶（ＲＡＭ）４０６と、ハードディスク・ドライブ（ＨＤＤ）４０８と、キーボード４１０と、マウス４１２と、ディスプレイ４１４が接続されている。ＣＰＵ４０４は、好適には、３２ビットまたは６４ビットのアーキテクチャに基づくものであり、例えば、例えば、インテル社のCore(商標) i3、Core(商標) i5、Core(商標) i7、Xeon(R)、AMD社のAthlon(商標)、Phenom(商標)、Sempron(商標)などを使用することができる。主記憶４０６は、好適には、８ＧＢ以上の容量、より好ましくは、３２ＧＢ以上の容量をもつものである。
【００２４】
ハードディスク・ドライブ４０８には、オペレーティング・システムが、格納されている。オペレーティング・システムは、Linux（商標）、マイクロソフト社のWindows(商標) 7、Windows 8(商標)、Windows(商標)2008サーバ、アップルコンピュータのMac OS X(商標)などの、ＣＰＵ４０４に適合する任意のものでよい。この実施例ではさらに、ハードディスク・ドライブ４０８に、Java(R)仮想マシン（ＪＶＭ）を実現するためのJava(R) Runtime Environmentプログラムが格納されている。
【００２５】
ハードディスク・ドライブ４０８にはさらに、図５に関して後で説明する、メイン・プログラム５０２、URI入力ルーチン５０４、アノテーション付Java(R)クラス定義のファイル５０６、RDF表現生成プログラム５０８などが保存されている。
【００２６】
メイン・プログラム５０２、URI入力ルーチン５０４及びRDF表現生成プログラム５０８は、Ｃ、Ｃ＋＋、Java(R)などの既存のプログラミング言語処理系により、ＣＰＵ４０４に適合する実行可能形式のコードを生成し得るコンパイラによって作成することができる。
【００２７】
キーボード４１０及びマウス４１２は、オペレーティング・システムが提供するグラフィック・ユーザ・インターフェースに従い、ディスプレイ４１４に表示されたアイコン、タスクバー、テキストボックスなどのグラフィック・オブジェクトを操作するために使用される。
【００２８】
ディスプレイ４１４は、これには限定されないが、好適には、１０２４×７６８以上の解像度をもち、３２ビットtrue colorのＬＣＤモニタである。ディスプレイ４１４は例えば、RDF変換処理を操作する画面等を表示するために使用される。
【００２９】
通信インターフェース４１６は、好適には、イーサネット(R)プロトコルにより、ネットワーク４２０と接続されている。ネットワーク４２０には、アプリケーションのデータ全体５１４を格納したサーバ４３０が接続され、クライアント・コンピュータ４００は、RDF表現生成のため、所定のAPIに従い、サーバ４３０にデータを要求する。なお、ネットワーク４２０は、インターネット、ＬＡＮ、ＷＡＮなどの任意のネットワークであってよい。
【００３０】
次に、図５を参照して、本発明の処理を実行するための機能要素につて説明する。図５において、メイン・プログラム５０２は、通信モジュール５１６を介してサーバ４３０にデータを要求したり、その他全体の処理を統合する機能を有する。
【００３１】
URI入力ルーチン５０４は、クライアント・コンピュータ４００でローカルに動作するアプリケーションあるいは、ネットワーク４２０を介して接続された、遠隔のコンピュータ・システムから、URIを受け取る。
【００３２】
アノテーション付Java(R)クラス定義のファイル５０６は、予めこの発明の処理のためにユーザなどによって作成されたものであり、好適にはハードディスク・ドライブ４０８に保存される。
Java(R)クラスにアノテーションを付加するメソッドは、JavaBeans命名規則に沿ったものとなる。すなわち：
Getterメソッド
public
名前はgetで始まり、先頭文字を大文字にしたプロパティ名が続く。
パラメータを持たない
戻り型は、対応するプロパティの型
Setterメソッド
public
名前はsetで始まり、先頭文字を大文字にしたプロパティ名が続く。
パラメータは、対応するプロパティの型
戻り型はvoid
プロパティ
privateフィールド変数
そのGetterメソッドとSetterメソッドを通じてのみアクセスできる。
さらにアノテーションを付与するJava(R)のクラス定義のプロパティには、プロパティの型は、具象クラスか、具象クラスの配列でなければならないという制約がある。Java(R)のクラスに対するアノテーションの付与は、好適には、Eclipse(商標)などの統合開発環境を使用して行うことができる。尚、アノテーション付Java(R)クラスの例は後述する。
【００３３】
RDF表現生成プログラム５０８は、URI入力ルーチン５０４から受け取ったURIに基づき、アノテーション付Java(R)クラス定義に従い、アノテーション付Java(R)クラスのJavaオブジェクトを生成し、そのアノテーションに従い構成したAPI呼び出しにより、通信インターフェース４１６を介してAPI呼び出しによりサーバ４３０から、そこに格納されているアプリケーションのデータ全体５１４の一部を取得する。そして、処理のためクライアント・コンピュータ４００の主記憶４０６に、取得したアプリケーションのデータの一部５１０として保持する。RDF表現生成プログラム５０８は、アプリケーションに従ってJava(R)オブジェクトを生成し、それに取得したアプリケーションのデータの一部から変数をセットする。RDF表現生成プログラム５０８は、このような処理によって得られた複合Java(R)オブジェクトに基づき、RDF表現５１２を生成し、好適にはハードディスク・ドライブ４０８に保存する。このような処理の詳細は、図６のフローチャートを参照して後で説明する。
【００３４】
サーバ４３０は、クライアント・コンピュータ４００から受け取ったAPIの、API処理ルーチン５１６と、API処理ルーチン５１６の処理に従い、アプリケーションのデータ全体５１４から一部のデータを抽出してクライアント・コンピュータ４００にデータを送信するデータ送信ルーチン５１８を含む。なお、一例では、サーバ４３０に格納された外部アプリケーションはSAP ERPであり、APIは、SAP BAPIである。
【００３５】
次に、図６のフローチャートを参照して、RDF表現生成プログラム５０８の処理を説明する。
【００３６】
図６のステップ６０２では、RDF表現生成プログラム５０８は、URI入力ルーチン５０４から受け取ったURIを解析し、ルートクラス名と、APIパラメータを生成する。
【００３７】
ステップ６０４で、RDF表現生成プログラム５０８は、生成したルートクラス名と、APIパラメータに基づき、アノテーション付Java(R)クラス定義に従い、ルートクラスのJava(R)オブジェクトを生成する。
【００３８】
ステップ６０６で、RDF表現生成プログラム５０８は、生成したJava(R)オブジェクトのアノテーションに従い、API呼び出しを行い、サーバ４３０のアプリケーションのデータ全体５１４からデータの一部を取得する。
【００３９】
ステップ６０８で、RDF表現生成プログラム５０８は、生成したJava(R)オブジェクトのアノテーションに従い、データの一部からJava(R)オブジェクトを生成し、ローカル変数をセットする。
【００４０】
ステップ６１０で、RDF表現生成プログラム５０８は、ステップ６０８で生成したJava(R)オブジェクトのクラスのアノテーションに外部アプリケーションAPIを指定するものがあるかどうは判断し、もしそうなら、ステップ６０６に戻る。
【００４１】
ステップ６０８で生成したJava(R)オブジェクトのクラスのアノテーションに外部アプリケーションAPIを指定するものがないなら、RDF表現生成プログラム５０８は、ステップ６１２で、ここまでに生成された複数のJava(R)オブジェクトのアノテーションに従い、RDF表現を生成する。なお、ユーザ定義クラスのオブジェクトをRDF表現に変換する技術として、ELMO(http://www.openrdf.org/doc/elmo/1.4)、Jenabean(http://code.google.com/p/jenabean/)、OSLC4J(http://wiki.eclipse.org/Lyo/LyoOSLC4J)などがあり、ステップ６１２では、これら既存の技術の任意の技術を使用することができる。
【００４２】
次に、この発明を実施する、一例のアプリケーションにおける、アノテーション付Java(R)クラス定義と、その処理について説明する。
【００４３】
ここで使用されるクラスは、PurchaseOrder、POHeader、POItem、Vendor、VCardの５個であり、その内容は次のとおりである。
【００４４】
// クラス PurchaseOrder
@ApiCall(name="BAPI_PO_GETDETAIL1", params={"PURCHASEORDER"})
@OslcNamespace("http://yourcompany.com/ns/sap#")
public final class PurchaseOrder {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
private POHeader poHeader; 
@FieldName("POHEADER")
@OslcValueType(ValueType.LocalResource)
@OslcPropertyDefinition("http://yourcompany.com/ns/sap#" + "poHeader")
public POHeader getPoHeader() {
return poHeader;
}
public void setPoHeader(POHeader poheader) {
this.poHeader = poheader;
}
private POItem poItem[];
@FieldName("POITEM")
@OslcValueType(ValueType.LocalResource)
@OslcPropertyDefinition("http://yourcompany.com/ns/sap#" + "poItem")
public POItem[] getPoItem() {
return poItem;
}
public void setPoItem(POItem[] poitem) {
this.poItem = poitem;
}
}
【００４５】
// クラス POHeader
@OslcNamespace("http://yourcompany.com/ns/sap#")
public final class POHeader {
private Vendor vendor;
@FieldName("VENDOR")
@OslcPropertyDefinition("http://yourcompany.com/ns/sap#" + "vendor")
@OslcValueType(ValueType.LocalResource)
public Vendor getVendor() {
return vendor;
}
public void setVendor(Vendor vendor) {
this.vendor = vendor;
}
private Date created;
@FieldName("CREAT_DATE")
@OslcPropertyDefinition("http://yourcompany.com/ns/sap#" + "created")
@OslcValueType(ValueType.DateTime)
public Date getCreated() {
return created;
}
public void setCreated(final Date created) {
this.created = created;
}
}
【００４６】
// クラスPOItem
@OslcNamespace("http://yourcompany.com/ns/sap#")
public final class POItem {
String materialNumber;
@FieldName("MATERIAL")
@OslcPropertyDefinition("http://yourcompany.com/ns/sap#" + "materialNumber")
@OslcValueType(ValueType.String)
public String getMaterialNumber() {
return materialNumber;
}
public void setMaterialNumber(String materialNumber) {
this.materialNumber = materialNumber;
}
BigDecimal netPrice;
@FieldName("NET_PRICE")
@OslcPropertyDefinition("http://yourcompany.com/ns/sap#" + "netPrice")
@OslcValueType(ValueType.Decimal)
public BigDecimal getNetPrice() {
return netPrice;
}
public void setNetPrice(BigDecimal netPrice) {
this.netPrice = netPrice;
}
String description;
@FieldName("SHORT_TEXT")
@OslcPropertyDefinition("http://purl.org/dc/terms/" + "description")
@OslcValueType(ValueType.String)
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
【００４７】
// クラス Vendor
@ApiCall(name="BAPI_VENDOR_GETDETAIL", params={"VENDORNO"})
@OslcNamespace("http://yourcompany.com/ns/sap#")
public final class Vendor {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
private VCard detail;
@FieldName("GENERALDETAIL")
@OslcValueType(ValueType.LocalResource)
@OslcPropertyDefinition("http://yourcompany.com/ns/sap#" + "detail")
public VCard getDetail() {
return detail;
}
public void setDetail(VCard detail) {
this.detail = detail;
}
}
【００４８】
// クラス VCard
@OslcNamespace("http://www.w3.org/2006/vcard/ns#")
public final class VCard {
String name;
@FieldName("NAME")
@OslcPropertyDefinition("http://www.w3.org/2006/vcard/ns#" + "fn")
@OslcValueType(ValueType.String)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
String city;
@FieldName("CITY")
@OslcPropertyDefinition("http://www.w3.org/2006/vcard/ns#" + "adr")
@OslcValueType(ValueType.String)
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
【００４９】
上記のアノテーション付クラス定義において、
@ApiCallは、外部アプリケーションのAPIとパラメータを指定する。
@FieldNameは、取得データのフィールド値からJava(R)オブジェクトへの対応付けである。
@OslcNamespace
@OslcValueType
@OslcPropertyDefinition
は、Java(R)オブジェクトからRDF表現への対応付けであり、OSLC4Jのアノテーションを使用するものである。
【００５０】
この実施例で前提とするAPIは、複数の構造体(Structure)やテーブル(Table)がサーバ４３０からクライアント・コンピュータ４００に一度に返され、その後クライアント側でレコードやテーブルのデータをアクセスすることを可能ならしめるものである。なお、好適には、ここで構造体とは、個々の要素が基本データの連想配列である。また、テーブルとは、個々の要素が基本データの連想配列の配列である。図７は、APIを用いてクライアント・コンピュータ４００がサーバ４３０からデータを取得する様子を示す図である。
【００５１】
このとき、APIへのパラメータの渡し方は、次のとおりである。
（１）フィールド名に関するコンベンションを使用する
下記のコードで、フィールドid, id2, id3, .. の値を、paramsで指定した引数の値としてAPI呼出に渡す。
@ApiCall(name="BAPI_PO_GETDETAIL1", params={"PURCHASEORDER”, “ITEMNO”})
public final class PurchaseOrder {
private String id;
private String id2;
}
idとid2の値がそれぞれ4500017172と0010の場合、BAPI_PO_GETDETAIL1(PURCHASEORDER=4500017172、ITEMNO=0010)を生成して呼び出す。なお、パラメータ名でなく順番で引数が指定されるＡＰＩの場合、アノテーションでparamsは使われない。
【００５２】
（2）フィールド名にアノテーションを付加して、API呼出の実引として使われることを指定する
@ApiCall(name="BAPI_PO_GETDETAIL1", params={"PURCHASEORDER”, “ITEMNO”})
public final class PurchaseOrder {
@ApiArgument(1)
private String po_num;
@ApiArgument(2)
private String item_num;
}
【００５３】
（3）アノテーションがないときフィールド名に関するコンベンションを利用する - (1)と(2)の組み合わせ
【００５４】
以上の構成において、具体的な処理例を説明する。
RDF表現生成プログラム５０８が、図６のステップ６０２において、URI http://example.com/purchaseOrders/4500017172 を受け取ると仮定する。これを解析して、RDF表現生成プログラム５０８は、ルートクラス名PurchaseOrderと、パラメータ4500017172を得る。
【００５５】
次に、RDF表現生成プログラム５０８が、ステップ６０４において、ルートクラスのJava(R)オブジェクトである、PurchaseOrderのオブジェクトを図８に示すように生成する。
【００５６】
次に、RDF表現生成プログラム５０８が、ステップ６０６において、クラスPurchaseOrderのアノテーションで、外部アプリケーションAPIの名前とパラメータを指定する@ApiCallをつかって、API 呼び出しを以下のように作る。
BAPI_PO_GETDETAIL1(PURCHASEORDER=4500017172)
これを実行した結果がサーバ４３０から返される。
BAPI_PO_GETDETAIL1の返値は2個のStructure（フィールド名と値の組の集合）と22個のTable（フィールド名と値の組の集合の配列）である。各値はStructure名とフィールド名、またはTable名と行番号とフィールド名を指定することで一意に取り出すことができる。
こうして得られるデータは、図９に示すとおりである。
【００５７】
次に、RDF表現生成プログラム５０８が、ステップ６０８において、クラスPurchaseOrderのpoHeaderに @FieldName(“POHEADER”)が付加されているので、現在の対象SAP Structure を POHEADERに設定する。そして、poHeaderのクラスであるPOHeaderのオブジェクトを生成する。次に、クラスPOHeaderのフィールドのアノテーション@FieldName（“VENDOR”) と@FieldName(“CREAT_DATE”)にしたがってPOHEADERのエントリ値をアクセスする。そして、得られた値をPOHederの各フィールドの型に変換して、Setterメソッドを使って代入する。次に、POHeaderオブジェクトを PurchseOrderオブジェクトの poHeaderフィールド値として代入する。こうして得られるオブジェクトは図１０に示すとおりである。
【００５８】
次に、RDF表現生成プログラム５０８が、クラスPurchaseOrderのpoItemに@FieldName(“POITEM”)が付加されているので、現在の対象SAP Table を POITEMに設定（TableかStructureかは、配列か否かで判断）し、poItem のクラスであるPOItemのオブジェクトを生成する。そして、クラスPOItemのフィールドのアノテーション@FieldName("MATERIAL"),@FieldName("NET_PRICE"), @FieldName("SHORT_TEXT")にしたがってPOITEMのエントリ値をアクセスする。 得られた値をPOItemの各フィールドの型に変換して、Setterメソッドを使って代入する。そして、POItemオブジェクトを PurchseOrderオブジェクトのpoItemフィールド値として代入する。こうして得られるオブジェクトは図１１に示すとおりである。
【００５９】
次に、RDF表現生成プログラム５０８は、まだ処理されていないクラスのアノテーションが、生成されたオブジェクトのクラスVendorにあるので、ステップ６０６に戻って、アノテーションで指定される、以下のAPI呼出を行う。
BAPI_VENDOR_GETDETAIL1(VENDORNO=0005)
RDF表現生成プログラム５０８は、API呼出実行によって、得られるStructure GENERALDETAILに対して、クラスVCardのフィールドのアノテーションを使ってエントリ値を取り出してフィールドに代入する。こうして得られるオブジェクトは図１２に示すとおりである
【００６０】
こうしてRDF表現生成プログラム５０８は、ステップ６１０で、生成したオブジェクトのクラスのアノテーションに外部アプリケーションAPIを指定するものはないと判断して、ステップ６１２で、図１２に示すオブジェクト・グラフをトラバースして、オブジェクトからRDF表現への対応付けのアノテーションにしたがってRDF表現を生成する。
【００６１】
このようにして生成されたRDF表現は以下のとおりである。
<rdf:RDF
xmlns:sap="http://yourcompany.com/ns/oslcbridge/sap#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dcterms=“http://purl.org/dc/terms/”
xmlns:v=“http://www.w3.org/2006/vcard/ns#”>
<sap:PurchaseOrder rdf:about="http://example.com/purchaseOrder/4500017172">
<sap:poHeader>
<sap:POHeader>
<dcterms:created>2006-10-26T00:00:00.000+09:00</dcterms:created>
<sap:vendor>
<sap:Vendor>
<sap:detail>
<v:VCard>
<v:fn>Safety Clean Inc.</v:fn>
<v:adr>New York</v:adr>
</v:VCard>
</sap:detail>  
</sap:Vendor>
</sap:vendor>
</sap:POHeader>
</sap:poHeader>
<sap:poItem>
<sap:POItem>
<dcterms:description>Hydroxide Sludge</dcterms:description>
<sap:materialNumber>IDES_WA_0001</sap:materialNumber>
<sap:netPrice>250</sap:netPrice>
</sap:POItem>
</sap:poItem>
</sap:PurchaseOrder>
</rdf:RDF>
【００６２】
次に、実行時の状況で挙動を変える例を示す。
先ず、クラス定義が、以下のとおりとする。
@ApiCall(name="BAPI_VENDOR_GETDETAIL", params={"VENDORNO"})
public final class Vendor {
private String id;
@FieldName("GENERALDETAIL")
private VCard detail;
}
public final class VCard {
@FieldName("NAME")
String name;
@FieldName("CITY")
String city;
@FieldName(“SUPPLIER")
Vendorsupplier;
}
【００６３】
ここで初期オブジェクトが図１３のとおりだとする。すると、RDF表現生成プログラム５０８は、初期オブジェクトのクラスVendorの@ApiCallのパラメータを参照して、呼出BAPI_VENDOR_GETDETAIL(VENDORNO=0005)を生成して実行する。結果として図１４に示すStructureが返される。
【００６４】
次にRDF表現生成プログラム５０８は、@FieldName(“GENERALDETAIL”)によって、Vendorオブジェクトのプロパティdetailと返されたSAP Structure GENERALDETAILを関連付ける。そして、プロパティdetailのクラスVCardのオブジェクトを生成する。結果は図１５に示すようになる。
【００６５】
次にRDF表現生成プログラム５０８は、クラスVCardのアノテーションにしたがって値をセットする。このときVendorは@ApiCallの付いたクラスなので、まずVendorオブジェクトを生成し、次に値0013を生成したVendorにセットする。結果は図１６に示すようになる。
【００６６】
次にRDF表現生成プログラム５０８は、新たなオブジェクトのクラスVendorの@ApiCallのパラメータを参照して、呼出BAPI_VENDOR_GETDETAIL(VENDORNO=0013)を生成して実行する。結果として図１７に示すStructureが返される。
【００６７】
次にRDF表現生成プログラム５０８は、@FieldName(“GENERALDETAIL”)によって、Vendorオブジェクトのプロパティdetailと返されたSAP Structure GENERALDETAILを関連付ける。そして、プロパティdetailのクラスVCardのオブジェクトを生成する。結果は図１８に示すようになる。
【００６８】
次にRDF表現生成プログラム５０８は、クラスVCardのアノテーションにしたがって値をセットする。このときSUPPLIERの値がないので、Vendorオブジェクトは生成しない。未処理のアノテーションがないので、停止する。結果は図１９に示すようになる。
【００６９】
以上、特定の実施例に従い本発明の処理を説明してきたが、本発明はこの特定の構成あるいは実施例に限定して解釈されるべきではない。例えば、アノテーション付Java(R)定義は、一例であって、C++などアノテーション付記述を許容する任意のプログラミング言語を使用可能である。
【符号の説明】
【００７０】
４００・・・クライアント・コンピュータ
４０４・・・ＣＰＵ
４０６・・・主記憶
４０８・・・ハードディスク・ドライブ
４１６・・・通信インターフェース
４３０・・・サーバ
５０６・・・アノテーション付Javaクラス定義
５０８・・・RDF表現生成プログラム
【図１】
2014235631.tif 000003
【図２】
2014235631.tif 000004
【図３】
2014235631.tif 000005
【図４】
2014235631.tif 000006
【図５】
2014235631.tif 000007
【図６】
2014235631.tif 000008
【図７】
2014235631.tif 000009
【図８】
2014235631.tif 000010
【図９】
2014235631.tif 000011
【図１０】
2014235631.tif 000012
【図１１】
2014235631.tif 000013
【図１２】
2014235631.tif 000014
【図１３】
2014235631.tif 000015
【図１４】
2014235631.tif 000016
【図１５】
2014235631.tif 000017
【図１６】
2014235631.tif 000018
【図１７】
2014235631.tif 000019
【図１８】
2014235631.tif 000020
【図１９】
2014235631.tif 000021