セマンティック Web の CRUD 操作を PHP で作成する

SQL と SPARQL で CRUD (create, read, update, and delete) 操作を行う

CRUD (create, read, update, and delete) 操作は最も基本的なデータベース操作ですが、最も重要な操作でもあります。CRUD 操作は通常、SQL (Structured Query Language) を使ってリレーショナル・データベース・システムに対して行われます。しかし Web がより一層データベース指向になりつつあるため、SQL ベースの CRUD 操作からセマンティック Web ベースの CRUD 操作にシフトする必要があります。PHP を使ってセマンティック Web で CRUD 操作を行う方法を学びましょう。

Daniel J Lewis, Technology Evangelist/Computer Scientist, OpenLink Software

Daniel LewisDaniel Lewis は University of Bristol の大学院生です。彼の主な研究領域は機械学習とデータ・マイニングです。また彼はあらゆる種類のインテリジェント・システムに関心を持っており、オープンソースとクロスプラットフォーム開発の提唱者でもあります。コンピューター以外では、ガールフレンドと時間を過ごし、また宗教や哲学、心理学などの読書を楽しんでおり、そのすべてを彼のブログで読むことができます。



2008年 11月 25日

頻繁に使用する頭字語

  • API— Application Programming Interface
  • CRUD— Create, Read, Update, Delete
  • HTTP— Hypertext Transfer Protocol
  • MVC— Model-View-Controller
  • OOP— Object-Oriented Programming
  • RDF— Resource Description Framework
  • SPARQL— Simple Protocol and RDF Query Language
  • SQL— Structured Query Language
  • UI— User interface
  • W3C— World Wide Web Consortium

Web アプリケーションを開発する際には、データベース構造を作成し、その上にロジックや UI レイヤー用のサーバー・サイドのコードを置くことが標準的なプラクティスです。データベースに接続するために、サーバー・サイドのコードはレコードの作成、更新、削除、そして (最も重要な) 読み取り、という基本的な操作を行う必要があります。Web アプリケーションの背後にあるデータベースは通常はリレーショナル・データベースであるため、これらの CRUD 操作は、よく知られた言語である SQL を使って行われます。しかし Web 開発は OOP (Object-Oriented Programming: オブジェクト指向プログラミング) を使って行われることが多くなっているため、そうしたモデルは変わりつつあります。

RDF (Resource Description Framework) は、そうしたデータの意味合いを保持しつつオブジェクトを記述するのに最も適した方法です。そうしたデータに対するクエリーには通常 SPARQL (Simple Protocol and RDF Query Language: 「スパークル」と発音されます) が使われますが、これは SPARQL の構文が RDF そのものの構造と一致しているためです。RDF と SPARQL はどちらも、セマンティック Web スタックと呼ばれているものに含まれる技術です。

セマンティック Web の概念をフルに活用するためには、SPARQL を使って従来の Web 開発手法を RDF データに適用することができます。この記事では SQL を使う代わりに、単純化した MVC (Model-View-Controller) 設計パターン、サーバー・サイドのスクリプト言語である PHP、そして RDF に接続するための SPARQL を使ってリレーショナル・データベース・システムを操作する方法について説明します。

SQL と SPARQL による CRUD 操作

この記事の前提条件

この記事では、SQL と PHP、そして Web アプリケーション開発を基本的に理解していることを前提にしています。またセマンティック Web を理解していると役立ちます。セマンティック Web ベースのデータに対して createupdatedelete コマンドを実行するためには、SPARQL/Update 仕様をサポートするセマンティック Web データ・ストアが必要です。

CRUD 操作を SQL で作成する場合と SPARQL で作成する場合の類似点と相違点を調べてみましょう。リスト 1 は read (読み取り) 操作の SQL コードです。

リスト 1. SQL による read 操作
SELECT realname, dob, location
FROM UserTable 
WHERE realname = "John Smith";

この SQL ベースのコードを SPARQL ベースのコード (リスト 2) と比べてみてください。どちらも read 操作を行っていますが、これは read 操作が最も理解しやすく、また実装や説明も容易だからであり、この点は SQL でも SPARQL でも同じです。

リスト 2. SPARQL による read 操作
PREFIX foaf:
<http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?uri ?name ?dob ?location
FROM
<http://www.example.org/graph>
WHERE
{ ?uri
rdf:type foaf:Person ;
foaf:name "John Smith" ;
foaf:birthday
?dob ;
foaf:location ?location .
} ;

皆さんがこの 2 つのリストを比較したとき最初に感じることは、SPARQL バージョンの方が SQL バージョンよりも明らかに行数が多いということでしょう。それは事実ですが、だからといって当然 SQL の方が単純で簡潔なはずであると思い込んではいけません。どのエンジンに対して実行するかによりますが、SPARQL は Linked Data 効果と呼ばれるものを使って完全に分散させることができます。また SPARQL を使うと動的なスキーマを持つことができます。これは SQL が厳密にリレーショナルの視点を持つのに対して SPARQL は相互にリンクされたオブジェクトの視点を持つためです。もしリレーショナル・データベースのテーブルを分割し、多くのデータから成るアイランドにしたとすると、実際には SPARQL と比べて SQL の方が行数が多くなる上、SQL は例の面倒な JOIN 記述子で一杯になってしまいます。

SPARQL の最初の 2 行は PREFIX 宣言です。セマンティック Web の理論では、(オブジェクトにせよデータ・グラフ・ソース (これもオブジェクトですが) にせよ)、すべてのものが URI (Uniform Resource Identifier) を持っています。PREFIX 行は一時的なラベルを何らかの URI (この場合は FOAF (Friend of a Friend) スキーマと RDF スキーマ) に適用しているにすぎません。こうすることによるメリットは、後でクエリーの中で PREFIX 宣言を使うことができ、完全な URI を使う必要がないことです。

SPARQL コードの次の行はクエリー・リクエストを記述しています。このリクエストは基本的に SQL 文と同じですが、URI のリクエストが追加されている点が異なります。これらの項が変数であることを示すために疑問符 (?) が使われていることに注意してください。

SPARQL の FROM 文はどこからデータを取得するかを記述しており、この点は SQL の場合も同じです。両者の間で異なるのは、SPARQL ではデータ・ソースの名前が URI であり、コンピューターまたはネットワーク上の物理的な場所を記述するストリングではないという点です。

SPARQL の WHERE 文は SQL の場合とは非常に異なっていますが、これは SPARQL の場合、データを取得するためにどのスキーマを使うのかを指定する必要があるためです。この場合も、従来の方法で行おうとすると単純な SQL を大幅に上回るものが必要です。つまり PHP や Java™ プログラミング言語、あるいは他のサーバー・サイド言語を使ってデータ・ソース間でのチェックを行わなければなりません。SPARQL の WHERE 文で行われていることは、必ず Person 型のデータのみを取得するようにしているなど、かなり明らかです。SPARQL は何らかのパターン・マッチングを行いながら名前と場所を取得し、正しい John Smith を見つけます。


create (作成) 操作

SPARQL での CRUD 操作は一般に、read 操作が一番わかりやすく、他の操作はそれよりも多少わかりにくくなっています。しかし CRUD 操作を行うことは可能です。まず、create 操作では新しいレコードまたはオブジェクトをテーブルまたはグラフに挿入します。

リスト 3. SQL による create 操作
INSERT 
INTO UserTable (realname, dob, location) 
VALUES ("John Smith", "1985-01-01", "Bristol, UK");

では、同じ create 操作に対する SQL ベースのコード (リスト 3) と SPARQL ベースのコード (リスト 4) とを比べてみましょう。

リスト 4. SPARQL による creat 操作
PREFIX foaf:
<http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
INSERT 
INTO GRAPH <http://www.example.com/graph> 
(?realname, ?dob, ?location) 
{
<http://www.example.org/graph/johnsmith#me> rdf:Type 
foaf:Person ;  
foaf:name "John Smith" ;  
foaf:birthday 
<1985-01-01T00:00:00> ; 
foaf:location "Bristol, UK" 
}

SPARQL では、create 操作の場合も PREFIX 行の動作は read 操作の場合とまったく同じであることに注目してください。INSERT INTO は SQL と同じように動作しますが、ストリングやテーブル、名前をベースとしているのではなく URI ベースであるため、HTTP を使ってこの操作を行うことができます。この場合もやはりスキーマを指定する必要があります。この点は read 操作の場合よりも少し理解しやすいのですが、それはスキーマに準拠している限り実質的にどんな種類のプロパティーでも許されるためです。これが RDF で実現される、分散型で動的に拡張可能なオブジェクトによる形式化の優れた点です。

delete (削除) 操作

作成を行うと、どこかの時点でそれを削除する必要が出てくるはずです。例えば、ユーザーが皆さんのサイトでの自分のアカウントを削除したいと思うかもしれません (彼らがアカウントを削除してしまうのは明らかに残念なことですが、彼らにはそれなりの理由があるのかもしれません)。リスト 5 は典型的な delete 操作の SQL コードを示しています。

リスト 5. SQL による delete 操作
DELETE FROM UserTable 
WHERE realname = "John Smith"

では、SQL ベースのコード (リスト 5) と SPARQL ベースのコード (リスト 6) とを比べてみましょう。

リスト 6. SPARQL による delete 操作
DELETE 
FROM GRAPH <http://www.example.com/graph>
{<http://www.example.org/graph/johnsmith#me> ?predicate ?object }

SQL のコードと SPARQL のコードとの基本的な違いは、SQL はテーブルの行を削除するのに対して SPARQL は http://www.example.org/graph/johnsmith#me に示される「John Smith」オブジェクトに関連する「すべてのトリプル」を削除する点です。この違いは RDF モデルがグラフ・ベースの性質を持つことによるものです。

update (更新) 操作

多くの Web アプリケーションでは、ユーザーが自分の情報を更新できるようになっています。それを実現するのが update 操作です。リスト 7 と 8 は SQL と SPARQL での update 操作のコーディング方法を示しています。

リスト 7. SQL による update 操作
UPDATE UserTable
SET location = "Weston-super-Mare, UK"
WHERE realname = "Joanne Smith"

では update 操作に対する SQL ベースのコード (リスト 7) と SPARQL ベースのコード (リスト 8) とを比べてみましょう。

リスト 8. SPARQL による update 操作
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
MODIFY <http://www.example.org/graph> 
DELETE {?uri foaf:location ?location} 
INSERT {?uri foaf:location "Weston-super-Mare, UK"}
WHERE { ?uri foaf:name "Joanne Smith" }

SPARQL での update 操作は非常に馬鹿げているように見えるかもしれませんが、これはリレーショナル・テーブルの行を更新するのではなく、グラフ内の極めて具体的な 1 つの関係を更新するのだということを理解すれば、まったく妥当なことがわかります。update 操作を複数の場所にアクセスせずに最も容易に行う方法は、削除と挿入を行うことです。MODIFY というキーワードは適切なグラフへの接続を確立するために使われています。


SQL データベース・システムと SPARQL データベース・システムへの接続

上記の SQL 文と SPARQL 文を実行するためには、何らかの方法でシステムに接続する必要があります。当然ながら、異なるシステムには異なる接続方法があります。一般的な方法の 1 つは、ODBC (Open Database Connectivity) ドライバーを使って汎用のデータベースに接続する方法です。ODBC は Mac OS X システムや Linux® システムの最新バージョンには大抵含まれており、Windows® など他のオペレーティング・システムにもインストールすることができます。ODBC は要するに、皆さんが選択した SQL データベースに接続するための単純な汎用 API です。興味深いことに、ODBC は OpenLink Virtuoso など一部のセマンティック Web データ・ストアに対しても使うことができます。しかし他の大部分のセマンティック Web データ・ストアには、Seseme や Jena といったさまざまなシステムに対応した何らかのカスタムの接続手順やカスタムで作成された汎用の接続システムが必要です (例えばRDF2Go など。RDF2Go はこの記事の執筆時点で Java 技術にしか使用することができません)。HTTP を介してデータを公開する場合には、別の手段として、HTTP を介して SPARQL で接続する方法が考えられます。そうすればデータは「Linked Data」対応になり、完全に分散されます。SQL と SPARQL の接続方法の範囲は異なるため、それについての詳細はこの記事では省略します。


PHP による SQL と SPARQL

接続方法を選択したら、一般的な次のステップは共通の操作を PHP で確立することです。カスタマイズされたシステムでは、これは通常、関数の引数パラメーターとしてシステムに渡された PHP 変数を持つ、SQL ストリングを使って行われます。この関数は次にデータベースに接続し、そのトランザクションを実行します。ここで提案する方法は、SQL を使って RDBMS に接続する場合とまったく同じことを SPARQL を使って RDF に接続する場合に行います。

それでは、別のコード比較をしてみましょう。今度は PHP 言語を使い、上記で行ったコード比較と同じように read から始め、createdeleteupdate と進みます。ここでは SQL/SPARQL 文のストリング表現を引数に取る query_execute という架空のクエリー実行関数を使います。

read 操作

まずは、単純な read 操作を行います。PHP のストリング連結を使うと、クエリーに変数を組み入れることができます。

リスト 9. SQL による read 操作
function readUserInfo($realname) {
    $sqlstatement = "SELECT realname, dob, location FROM UserTable WHERE
    realname = \"" + realname + "\";";
return query_execute($sqlstatement);
    }

では、単純な read 操作に対する SQL ベースの PHP コード (リスト 9) とSPARQL ベースの PHP コード (リスト 10) とを比べてみましょう。

リスト 10. SPARQL による read 操作
function readUserInfo($realname) {
    $sqlstatement = "PREFIX foaf:
    <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?uri ?name ?dob ?location 
FROM <http://www.example.org/graph>
WHERE 
{ ?uri rdf:type foaf:Person ; 
foaf:name \"" + $realname + "\" ; 
foaf:birthday ?dob ;
foaf:location ?location .
} ;";
return query_execute($sparqlstatement);
}

これを見るとわかるように、上記の関数は関数名とパラメーターが同じになるように作成されています。これはつまり、SPARQL バージョンを即座に使い始めることができるということです。さらに、ODBC システムを使っている場合には、戻り型の変更を気にする必要がありません。

create 操作

create 操作も、read 操作の場合と同じです。次の PHP メソッドによってストリングに変数を組み入れ、動的なクエリーを実行します。リスト 11 は create 操作でそれを行う方法を示しています。

リスト 11. SQL による create 操作
function createUserInfo($realname, $dob,
    $location) {
    $sqlstatement = "INSERT INTO UserTable (realname, dob,
    location) VALUES (\"" + $realname + "\", \"" + $dob + "\", \"" +
    $location + "\");";
return query_execute($sqlstatement);
}

では create 操作に対する SQL ベースの PHP コード (リスト 11) と SPARQL ベースの PHP コード (リスト 12) とを比べてみましょう。

リスト 12. SPARQL による create 操作
function createUserInfo($uri, $realname,
    $dob, $location) {
    $sparqlstatement = "PREFIX foaf:
    <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
INSERT INTO GRAPH <http://www.example.com/graph>
    (?realname, ?dob, ?location) 
    { 
    " + $uri + " rdf:Type
    foaf:Person ;
    foaf:name \"" + $realname + "\" ;
    foaf:birthday
        <" + $dob + ">> ;
        foaf:location \"" + $location +
"\}"
return query_execute($sparqlstatement);
    }

簡単のため、この関数の SPARQL バージョンには URI パラメーターが含まれていますが、ストリング連結を追加して関数宣言を SQL の場合と同じにするのは非常に簡単です。

delete 操作

PHP での連結による注入を使って delete 操作を行います。ただしこの前のセクションで触れたように、SQL バージョンに渡す変数と SPARQL バージョンに渡す変数は異なります。リスト 13 は delete 操作の SQL コードを示しています。

リスト 13. SQL による delete 操作
function deleteUserInfo($realname) {
    $sqlstatement = "DELETE FROM UserTable WHERE realname = \"" + John Smith + "\"";
return query_execute($sqlstatement); 
}

では delete 操作に対する SQL ベースの PHP コード (リスト 13) と SPARQL ベースの PHP コード (リスト 14) とを比べてみましょう。

リスト 14. SPARQL による delete 操作
function deleteUserInfo($uri) {
    $sparqlstatement = "DELETE FROM GRAPH
    <http://www.example.com/graph> {<" + $uri +
    "> ?predicate ?object }"; 
    return query_execute($sparqlstatement); 
}

簡単のため、この場合も SPARQL バージョンの関数は実際の名前ではなく URI を引数に使っています。DELETE SPARQL 文と WHERE 文を使えば URI ではなく名前でデータを検索することができ、そうすれば関数ヘッダーは SQL バージョンと同じになります。

update 操作

PHP を使うと、レコードの更新は SQL の場合も SPARQL の場合も非常に簡単です。ただしリレーショナル・データベースと RDF の構造の違いに注意してください。リスト 15 は update 操作の SQL コードを示しています。

リスト 15. SQL による update 操作
function updateUserInfo($realname, $location)
    {
        $sqlstatement = "UPDATE UserTable SET location = \"" + $location
+ "\" WHERE realname = \"" + $realname+ "\";";
return query_execute($sqlstatement); 
    }

では update 操作に対する SQL ベースの PHP コード (リスト 15) とSPARQL ベースの PHP コード (リスト 16) とを比べてみましょう。

リスト 16. SPARQL による update 操作
function updateUserInfo($realname,
    $location) { 
    $sparqlstatement = " PREFIX foaf: <http://xmlns.com/foaf/0.1/>
MODIFY <http://www.example.org/graph>
DELETE {?uri foaf:location ?location} 
INSERT {?uri foaf:location \"" + $location + "\"}
WHERE { 
    ?uri foaf:name \"" + $realname + "\"
    }
        ";
        return query_execute($sparqlstatement);
    }

関数宣言は SQL の場合も SPARQL の場合も同じです。そのため、SQL を SPARQL に置き換えるのは簡単です。

SQL ベースのエンドポイントを持つデータ・ソースから SPARQL ベースのエンドポイントを持つデータ・ソースへの移行は非常に容易ですが、移行にあたっては次の 2 つの重要な事柄についてよく認識しておく必要があります。それは抽象化のレベルと、SQL と SPARQL の類似点および相違点です。両方の言語が実質的に同じだと考えるような誤った感覚を持たないようにしなければなりません。それぞれの言語の制約を理解すると同時に、その言語の特徴、特にそれぞれの言語で実現されるさまざまな構文糖やグラフィカルな表現などを活用することが重要です。


抽象化のレベル

この記事のサンプル・コードはデータベースの構造と強く結びついています。SQL と RDBMS の場合、理論的には、テーブル構造の再構成が行われるまでは、SQL と RDBMS で対処可能なあるレベルの疎結合が存在するのみです。しかし SPARQL と RDF の場合には、そんなことはありません。RDF は分散型で相互リンクされた性質のものであるため、SPARQL の場合にはデータとの結合は非常に抽象的です。この記事で紹介した例の抽象化をさらに進めると、それらの例の再利用性が高まるかもしれません。しかしこの記事では SPARQL と SQL との間の類似点と相違点を例示するために、単純な密結合された関数を使いました。

この記事のサンプル・コードからわかるように、SQL と SPARQL は多くの点で似ています。しかし Web ベースでグラフィカル、そしてオブジェクト指向という RDF の性質や、そうした性質が SPARQL 言語の中にどのように取り入れられているかを理解すると、両者の違いがわかります。単純化したおおまかなルールとして、RDF のトリプル構造と SPARQL は基本的に、それぞれ一意に決まる行の主キー (主語)、属性や列の名前 (述語または関係)、そして行と列に基づくセル・データ (目的語) を表している、と考えることができます。さらに、SPARQL では HTTP による通信をフルに活用できるため、(必ずしも必要なことではありませんが) イントラネットやエクストラネット、そしてさらに広範なインターネットを介してデータを配布することができます。


なぜ SQL から SPARQL に移行する必要があるのか

SQL から SPARQL に移行する理由はたくさんあります。詳細はこの記事では説明しませんが、次のような場合には SQL から SPARQL に移行する価値があります。

  • より分散型のデータ・ソリューションが必要な場合。
  • Web 上でデータを公開し、人々が使用できるように、またリンクできるようにしたい場合。
  • リレーショナル・データベースのモデルよりも、ノード - アーク - ノードという関係 (トリプル) の方が理解しやすいと思える場合。
  • OOP のパラダイムを使って作業するために純粋にオブジェクト指向の手法でデータを理解したい場合 (PHP V5 以降は OOP をサポートしています)。
  • Web 上のデータ・ソースに接続できる汎用のエージェントを作成したい場合。

もちろん、SQL から移行しない方がよい理由もあり、そうした理由はおそらく完全に妥当なものです。SPARQL はクエリーを実行するための別の方法であり、必ずしも SQL を直接置き換えるものではありません。同じことはリレーショナル・データとセマンティック Web ベースのデータについても言えます。これらのデータはお互いの置き換えではありません。むしろ新しい手法と古い手法とを融合させて混合型のシステムを作り、古いレガシー・システムや、現在のシステム、さらには将来のシステムからも処理できるようにするのがベストなのです。

参考文献

学ぶために

  • W3C Recommendation for 15 Jan 2008, SPARQL Query Language for RDF は SPARQL に対する W3C の仕様です。この中には文法の情報や、わかりやすい例が含まれています。
  • HP Labs の SPARQL/Update: A language for updating RDF graphs は、SPARQL 言語の update 拡張機能について知らなければならないことをすべて網羅しています。(create、update、delete 操作のすべてを知るために、まずこのサイトを訪れてください。)
  • W3C による Semantic Web Activity のページには、セマンティック Web 技術のスタックの中にあるすべての仕様がリンクされています。また SPARQL と RDF に関する興味深い記事も紹介されています。
  • SQL に関する ISO 仕様を購入することができ、この中には最新バージョンの SQL の詳細がすべて含まれています。
  • W3Schools.com の SQL のチュートリアルと参考資料のページには、平均的な Web 開発者がデータベースを扱う際に知っておくべきことがすべて説明されています。
  • PHP.net には PHP 開発者のためのリソースが集まっています。
  • Recommended PHP reading list」を調べてみてください。
  • developerWorks には他にも PHP に関する資料が豊富に用意されています。
  • IBM developerWorks の PHP project resources を利用して PHP のスキルを磨いてください。
  • developerWorks podcasts では、ソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • PHP でデータベースを使うのであれば、Zend Core for IBM を調べてみてください。これはシームレスでそのまま使用でき、インストールも容易な、IBM DB2 V9 をサポートする PHP の開発環境でもあり本番環境でもあります。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
  • IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。

製品や技術を入手するために

  • 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
  • IBM 製品の評価版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=361059
ArticleTitle=セマンティック Web の CRUD 操作を PHP で作成する
publish-date=11252008