Hercules version 0.03リリース
Herculesのversion 0.03を公開しました。変更点配下の通りです。
- RDF-Classベースでの走査が可能になった
- キャッシュの無効化が可能になった
HerculesResource.prototype.getValue()
へのショートカットHerculesResource.prototype.$()
が定義された- リソースが持つ目的語を全てを返す
HerculesResourceUri.prototype.getAllObjects()
が定義された。HerculesResourceUri.prototype.getObject()
は同じ述語が複数の目的語を持つ場合は先頭の1つを返すようになった - リソースが持つ述語を全てを返す
HerculesResourceUri.prototype.getAllPredicates()
が定義された - リテラルリソースのデータタイプを扱う
HerculesResourceLiteral.prototype.getDataType()
、HerculesResourceLiteral.prototype.setDataType()
が定義された - リテラルリソースの言語を扱う
HerculesResourceLiteral.prototype.getLanguage()
、HerculesResourceLiteral.prototype.setLanguage()
が定義された
RDF-Classベースでの走査は、雰囲気としてはRailsのPerson.find_all()
をほぼそのままコピーしたような感じです。ただし、RDFの場合明確なDBのスキーマというものが存在しないので(RDFスキーマは使えません)、グラフ上に何種類のクラスが存在するのかが分かりません。Herculesでは<http://www.w3.org/2000/01/rdf-schema#Class>のサブクラスを1度問い合わせ、得られたリストの結果を基に動的にJavaScriptのクラスを定義しています。なお、クラス名がURIのままだとJavaScript的に無理があるので、あらかじめ登録されたPrefixを元に、QName形式に変換できた場合のみ、クラスとして定義されます。また、クラスがグローバルで定義すると色々と問題があるので、Herculesのプロパティとして定義されるようになっています。
e = new Hercules("http://path/to/sparql/server");
e.registerPrefix("", "http://mynamespace/"); // dafault prefix
e.registerPrefix("foaf", "http://xmlns.com/foaf/0.1/");
e.registerPrefix("dc", "http://purl.org/dc/elements/1.1/");
// define JavaScript classes automatically
e.defineExistClasses();
// RDF-Class-based search
people = e.foaf$Person.findAll();
alert(people[0].foaf$name.$()); // -> Someone's name
パフォーマンス的にちょっと辛い部分があるので、何か対策を考えないといけないのですが、「グラフ上に何がどれだけあるか把握することが不可能」というのが前提な以上、クライアント側でCoC的なコードを書くのには限界がありそうです。ある程度は設定を自分で書くことになるでしょう。