SPARQLthon/SPARQL11test

提供:TogoWiki

移動: 案内, 検索

ページのサイズが大きくなったので、2018年4月27日時点でダウンロード可能なものについての最新調査結果をこちらに置きました。 以前のページはBH12.12/SPARQL11testです。


Learning SPARQL 2nd Ed.サンプルSPARQLクエリを全て処理させてパーズ可能であるかをテストする。 様々な実装に対して行うことで、実装間の比較が行える。

目次

クエリの問題への対処

まずはApache Jenaについて試してみたところ、幾つかのクエリについてはPREFIX指定が抜けているものがあるなど幾つかの問題が判明したので、これを修正した。

PREFIX欠落

  • ex025.rq
  • ex048.rq
  • ex049.rq
  • ex114.rq
  • ex269.rq
  • ex528.rq

その他の文法間違い

  • ex067.rq

FILTER が抜けている。

 NOT EXISTS { ?s ab:workTel ?workNum }

ではなくて、

 FILTER NOT EXISTS { ?s ab:workTel ?workNum }

本文中で触れられず

下記の両者ともクエリ未完成

  • ex080.rq
  • ex541.rq

全トリプル取得

末尾にLIMIT 10を挿入

  • ex052.rq
  • ex090.rq
  • ex114.rq
  • ex225.rq
  • ex242.rq
  • ex244.rq
  • ex246.rq
  • ex251.rq
  • ex255.rq
  • ex311.rq
  • ex332.rq
  • ex408.rq
  • ex436.rq
  • ex437.rq

テスト

テストした実装を以下に列挙していくこととする。

AllegroGraph 6.4.5

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://localhost:21400/repositories/dbcls --query=${f} --debug >& ../LearningSPARQL2ndEx_AllegroGraph_6.4.5/${o}.txt ; done'
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   173 -
    21 @prefix err:   <http://www.w3.org/2005/xqt-errors#> .
    11 @prefix ab:    <http://learningsparql.com/ns/addressbook#> .
    10 HTTP Exeception
     3 Ask => No
     1 @prefix nn:    <http://learningsparql.com/new/namespace/> .
     1 @prefix im:    <http://learningsparql.com/ns/importedData#> .
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex126.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex172.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex178.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex180.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex196.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex308.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex474.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex475.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex476.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex539.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
  • ついにWHERE外のVALUESを適切に扱えるようになった。
  • <file_name.ttl>というグラフ名は受け付けられなくなった。
  • ex308.rqはARQ独自関数利用のため。
  • その他、全てSERVICEクエリ周りで、DBpediaの返すリテラル値がxsd:date型としているにもかかわらず、例えば"1937-3-4"となっていることでエラー(400 Bad Request、'Parsing JSON failed due to unhandled error: `1937-3-4` is not of type date')になっている。この例の場合では、"1937-03-04"としなければならない(参考)。

AllegroGraph 6.4.0

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://localhost:21400/repositories/dbcls --query=${f} --debug >& ../LearningSPARQL2ndEx_AllegroGraph_6.4.0/${o}.txt ; done'
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   173 -
    35 @prefix :      <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
     8 HTTP Exeception
     3 Ask => No
     1 ==== No variables ====
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex172.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
ex178.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
ex196.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
ex308.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
ex474.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
ex475.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
ex476.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
ex539.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.execCommon(HttpQuery.java:446)
  • 遂にtimezone、tz関数に対応した模様。
  • ex308.rqはARQ独自関数利用のため。
  • ex492.rqはVALUESをWHEREの外に書いている例でこれに未対応の模様。
  • 以上のクエリを除いて全てSERVICEクエリ周りで、DBpediaの返すリテラル値がxsd:date型としているにもかかわらず、例えば"1937-3-4"となっていることでエラー(400 Bad Request、'Parsing JSON failed due to unhandled error: `1937-3-4` is not of type date')になっている。この例の場合では、"1937-03-04"としなければならない(参考)。

Apache Jena 3.7.0

sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`;  ./bin/qparse --print=op --explain --file ${f} > ../LearningSPARQL2ndEx_Jena-3.0.1/${o}.txt ; done'
Loading function or property function with old style 'jena.hpl.hp.com' used - preferred style is to use 'jena.apache.org': http://jena.hpl.hp.com/ARQ/property#versionARQ => http://jena.apache.org/ARQ/property#versionARQ

Apache Jena Fuseki 3.7.0

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://ep:21800/dbcls/query --query=${f} --debug >& ../LearningSPARQL2ndEx_Jena-Fuseki_3.7.0/${o}.txt ; done'
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   179 -
    19 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    12 @prefix ab:    <http://learningsparql.com/ns/addressbook#> .
     3 Ask => No
     2 @prefix d:     <http://learningsparql.com/ns/data#> .
     1 @prefix nn:    <http://learningsparql.com/new/namespace/> .
     1 @prefix im:    <http://learningsparql.com/ns/importedData#> .
     1 12:45:29 WARN  riot                 :: [line: 13, col: 17] Lexical form '1860-11-7' not valid for datatype XSD date
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'

Apache Marmotta 3.3.0

$ foreach f ( ../LearningSPARQL2ndEx/ex*.rq )
set a=`basename $f .rq`
./bin/rsparql --service='http://localhost:8080/marmotta/sparql' --query ${f} --debug >& ../LearningSPARQL2ndEx_Marmotta_3.3.0/${a}.txt
end
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   174 -
    15 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    12 @prefix ab:    <http://learningsparql.com/ns/addressbook#> .
     4 HTTP Exeception
     3 Ask => No
     3 @prefix :      <http://purl.org/dc/terms/> .
     1 @prefix owl:   <http://www.w3.org/2002/07/owl#> .
     1 @prefix nn:    <http://learningsparql.com/new/namespace/> .
     1 @prefix im:    <http://learningsparql.com/ns/importedData#> .
     1 @prefix d:     <http://learningsparql.com/ns/data#> .
     1 ==== No variables ====
     1 23:02:34 WARN  riot                 :: Lexical form '1860-01-01+02:00' not valid for datatype http://www.w3.org/2001/XMLSchema#gYear
     1 23:01:32 WARN  riot                 :: {W107} Bad URI: <2014-12-18T22:55:21.000+09:00> Code: 10/SCHEME_MUST_START_WITH_LETTER in SCHEME: The scheme component must start with a letter.
     1 23:01:07 WARN  riot                 :: Lexical form '1860-01-01+02:00' not valid for datatype http://www.w3.org/2001/XMLSchema#gYear
     1 23:00:57 WARN  riot                 :: Lexical form '1860-01-01+02:00' not valid for datatype http://www.w3.org/2001/XMLSchema#gYear
$ grep 'HTTP Exeception' *.txt | sed -e 's/^/ /'
ex118.txt:HTTP Exeception
ex257.txt:HTTP Exeception
ex262.txt:HTTP Exeception
ex308.txt:HTTP Exeception
  • ex118 はOFFSETだけでなく、LIMITも加えると問題が解消。
  • ex257 はxsd:decimalに非対応。
  • ex262 はxsd:dateTimeに非対応。
  • ex308 はARQ独自関数のため。

Blazegraph Release 2.1.0 - 2.1.4

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://ep:21300/bigdata/sparql --query=${f} --debug >& ../LearningSPARQL2ndEx_Blazegraph_2.1.0/${o}.txt ; done'
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   178 -
    22 @prefix bds:   <http://www.bigdata.com/rdf/search#> .
     7 @prefix bd:    <http://www.bigdata.com/rdf#> .
     7 @prefix ab:    <http://learningsparql.com/ns/addressbook#> .
     3 Ask => No
     1 HTTP Exeception
     1 @prefix nn:    <http://learningsparql.com/new/namespace/> .
     1 16:21:57 ERROR riot                 :: [line: 36, col: 46] Triples not terminated by DOT
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex308.txt-     at com.hp.hpl.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:414)
  • ex308.rq はarq独自関数を含むため。

CumulusRDF 1.0.1

$ foreach f ( ../LearningSPARQL2ndEx/ex*.rq )
set a=`basename $f .rq`
./bin/rsparql --service='http://localhost:9090/cumulus/sparql' --query ${f} --debug >& ../LearningSPARQL2ndEx_CumulusRDF_1.0.1/${a}.txt
end
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   172 -
    32 @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
     7 HTTP Exeception
     3 Ask => No
     3 @prefix :      <http://dbpedia.org/ontology/> .
     1 @prefix v:     <http://www.w3.org/2006/vcard/ns#> .
     1 @prefix dc:    <http://purl.org/dc/elements/1.1/> .
     1 ==== No variables ====
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex007.txt-ERROR /cumulus/sparql 400: Not a valid (absolute) URI: ex002.ttl
ex123.txt-ERROR /cumulus/sparql 400: Not a valid (absolute) URI: ex069.ttl
ex126.txt-ERROR /cumulus/sparql 400: Not a valid (absolute) URI: ex125.ttl
ex128.txt-ERROR /cumulus/sparql 400: Not a valid (absolute) URI: ex125.ttl
ex130.txt-ERROR /cumulus/sparql 400: Not a valid (absolute) URI: ex069.ttl
ex135.txt-ERROR /cumulus/sparql 400: Not a valid (absolute) URI: ex134.ttl
ex180.txt-ERROR /cumulus/sparql 400: Not a valid (absolute) URI: ex125.ttl
  • "<ex002.ttl>"といったURIに未対応。
  • 他の多くの実装と同様、VALUESがWHERE外にある場合には未対応。

D2RQ 0.8.2dev - 0.8.3dev

$ foreach f ( ../LearningSPARQL2ndEx/ex*.rq )
set a=`basename $f .rq`
./bin/rsparql --service 'http://xxx/sparql/' --query ${f} --debug >& ../LearningSPARQL2ndEx_D2RQ_0.8.2dev/${a}.txt
end
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   168 -
    34 @prefix db:    <http://localhost:2020/resource/> .
    14 HTTP Exeception
     3 Ask => No
     1 @prefix dc:    <http://purl.org/dc/elements/1.1/> .
$ grep -A1 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | sed -e 's/-HttpException//' | sed -e 's/^/ /'
ex007.txt: 400 This service does not allow the dataset to be specified in the query
ex123.txt: 400 This service does not allow the dataset to be specified in the query
ex126.txt: 400 This service does not allow the dataset to be specified in the query
ex128.txt: 400 This service does not allow the dataset to be specified in the query
ex130.txt: 400 This service does not allow the dataset to be specified in the query
ex135.txt: 400 This service does not allow the dataset to be specified in the query
ex166.txt: 400 This service does not allow the dataset to be specified in the query
ex180.txt: 400 This service does not allow the dataset to be specified in the query
ex182.txt: 400 This service does not allow the dataset to be specified in the query
ex492.txt: 400 Parse error:  PREFIX  dm:   <http://learningsparql.com/ns/demo#>  SELECT  * WHERE   {  } VALUES ( ?color ?direction ) {   ( dm:red "north" )   ( dm:blue "west" ) }   Lexical error at line 6, column 7.  Encountered: " " (32), after : "VALUES"
ex496.txt: 400 Parse error:  PREFIX  e:    <http://learningsparql.com/ns/expenses#>  SELECT  ?description ?date ?amount WHERE   { ?meal e:description ?description .     ?meal e:date ?date .     ?meal e:amount ?amount     VALUES ?description { "lunch" "dinner" }   }   Lexical error at line 8, column 11.  Encountered: " " (32), after : "VALUES"
ex498.txt: 400 Parse error:  PREFIX  e:    <http://learningsparql.com/ns/expenses#>  SELECT  ?description ?date ?amount WHERE   { ?meal e:description ?description .     ?meal e:date ?date .     ?meal e:amount ?amount     VALUES ( ?date ?description ) {       ( "2011-10-15" "lunch" )       ( "2011-10-16" "dinner" )     }   }   Lexical error at line 8, column 11.  Encountered: " " (32), after : "VALUES"
ex500.txt: 400 Parse error:  PREFIX  e:    <http://learningsparql.com/ns/expenses#>  SELECT  ?description ?date ?amount WHERE   { ?meal e:description ?description .     ?meal e:date ?date .     ?meal e:amount ?amount     VALUES ( ?date ?description ) {       ( UNDEF "lunch" )       ( "2011-10-16" UNDEF )     }   }   Lexical error at line 8, column 11.  Encountered: " " (32), after : "VALUES"
ex540.txt: 400 This service does not allow the dataset to be specified in the query

FROMとVALUESに非対応。

Dydra (2015/09/15)

以前のテスト時に比べて格段に対応クエリが増加している。

$ foreach f ( ../LearningSPARQL2ndEx/ex*.rq )
set a=`basename $f .rq`
./bin/rsparql --service 'http://dydra.com/xxx/sparql/' --query ${f} --debug >& ../LearningSPARQL2ndEx_Dydra/${a}.txt
end
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   173 -
    30 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    10 HTTP Exeception
     3 Ask => No
     2 @prefix ns5:   <http://www.w3.org/2002/07/owl#> .
     1 @prefix ns6:   <http://purl.org/dc/terms/> .
     1 22:17:24 WARN  riot                 :: {W109} The namespace URI: <http%3A%2F%2Fwww.w3.org%2F2002%2F07%2Fowl%23> is relative. Such ...
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex167.txt-
ex170.txt-
ex172.txt-
ex178.txt-
ex196.txt-
ex474.txt-
ex475.txt-
ex476.txt-
ex539.txt-
  • SERVICEクエリは、dydra内にあるデータセットに対してのみ可能としているらしい。

GraphDB 8.5.0

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://ep:21700/repositories/DBCLS --query=${f} --debug >& ../LearningSPARQL2ndEx_GraphDB_8.5.0/${o}.txt ; done'
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   167 -
    15 HTTP Exeception
     4 <http://www.w3.org/2002/07/owl#equivalentProperty>
     3 Ask => No
     1 ==== No variables ====
     1 <http://learningsparql.com/ns/data/book312>
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex007.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex123.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex126.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex128.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex130.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex135.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex172.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex178.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex180.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex196.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex308.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex474.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:374)
ex475.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex476.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:374)
ex539.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:374)
  • "<ex002.ttl>"といったURIに未対応。(ex007.rq - ex180.rq)
  • DBpedia.orgのSPARQLエンドポイントへはクエリは適切になされているが、得られる結果のデータ型に問題があるためエラーになっている。

(datatype rdf:langString requires a language tag)

  • ex308.rqはARQ独自関数利用のため。

MarkLogic 8.0-6

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; curl --anyauth --user user:pass -i -X POST --data-binary @${f} -H "Content-type: application/sparql-query" -H "Accept: application/sparql-results+json" http://localhost:8000/v1/graphs/sparql > ../LearningSPARQL2ndEx_MarkLogic_8.0-6/${o}.txt ; done'
$ grep '^{' *.txt | grep errorResponse | cut -c1-120 | sed -e 's/^/ /'
ex128.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex130.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex135.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex136.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex167.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex170.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex172.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex176.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex178.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex180.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex182.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex184.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex185.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex188.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex190.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex192.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex194.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex196.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex203.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex205.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex207.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex209.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex211.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex212.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex213.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex215.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex216.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex237.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex246.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex248.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex253.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex255.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex267.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex282.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex305.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex308.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNDFUN", "message":"XDMP-UNDFU
ex314.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex326.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex332.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex341.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex427.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex428.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex437.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex474.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex475.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex476.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex479.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex480.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex491.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex523.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
ex538.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-COLLXCNNOTFOUND", "message":"X
ex539.txt:{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-U
ex540.txt:{"errorResponse":{"statusCode":406, "status":"Unacceptable Type", "messageCode":"REST-UNACCEPTABLETYPE", "mess
  • 現時点ではあまり対応されていない模様。

Neptune 1.0.1.0

$ for f in ./LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./apache-jena-3.7.0/bin/rsparql --service=http://***.neptune.amazonaws.com:8182/sparql --query=${f} --debug >& ./LearningSPARQL2ndEx_Neptune_1.0.1.0/${o}.txt ; done
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   172 -
    19 @prefix owl:   <http://www.w3.org/2002/07/owl#> .
    12 @prefix ab:    <http://learningsparql.com/ns/addressbook#> .
    10 HTTP Exeception
     3 Ask => No
     1 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
     1 @prefix nn:    <http://learningsparql.com/new/namespace/> .
     1 @prefix im:    <http://learningsparql.com/ns/importedData#> .
     1 @prefix d:     <http://learningsparql.com/ns/data#> .
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex167.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex170.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex172.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex178.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex196.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex308.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex474.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex475.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex476.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex539.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
  • Federatedクエリの利用は不可のため、SERVICEを含むクエリ(ex308以外)が失敗している。
  • ex308.rqについてはARQ独自関数が実行できないため。

RDF-Endpoint-0.07

$ foreach f ( ../LearningSPARQL2ndEx/ex*.rq )
set a=`basename $f .rq`
./bin/rsparql --service='http://localhost:5000/sparql' --query ${f} --debug >& ../LearningSPARQL2ndEx_RDF-Endpoint-0.07/${a}.txt
end
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   176 -
    35 @prefix arq:   <http://jena.hpl.hp.com/ARQ/function#> .
     3 com.hp.hpl.jena.sparql.resultset.ResultSetException: Not a boolean result
     3 HTTP Exeception
 $ grep 'Exception' *.txt | grep -v 'Caused by' | sed -e 's/^/ /'
ex199.txt:com.hp.hpl.jena.sparql.resultset.ResultSetException: Not a boolean result
ex201.txt:com.hp.hpl.jena.sparql.resultset.ResultSetException: Not a boolean result
ex202.txt:com.hp.hpl.jena.sparql.resultset.ResultSetException: Not a boolean result
ex492.txt:HttpException: 400 Bad Request
ex498.txt:HttpException: 400 Bad Request
ex500.txt:HttpException: 400 Bad Request
  • SERVICEキーワードについては問題が解消された。
  • ASKキーワードには非対応 (ex199.rq, ex201.rq, ex202.rq)。
  • ex492.rq について、VALUESのSELECT句外での使用に非対応の可能性。
  • ex498.rq, ex500.rq について、VALUESキーワードの処理に問題がある模様。

RDF4J 2.2.4 - 2.4.1

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://localhost:21100/rdf4j-server/repositories/SYSTEM --query=${f} --debug >& ../LearningSPARQL2ndEx_RDF4J_2.2.4/${o}.txt ; done'
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   167 -
    15 HTTP Exeception
    15 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    11 @prefix ab:    <http://learningsparql.com/ns/addressbook#> .
     4 @prefix :      <http://www.openrdf.org/config/repository#> .
     3 Ask => No
     1 @prefix owl:   <http://www.w3.org/2002/07/owl#> .
     1 @prefix nn:    <http://learningsparql.com/new/namespace/> .
     1 @prefix im:    <http://learningsparql.com/ns/importedData#> .
     1 @prefix d:     <http://learningsparql.com/ns/data#> .
     1 ==== No variables ====
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /' | cut -c1-100
ex007.txt-MALFORMED QUERY: Not a valid (absolute) IRI: ex002.ttl
ex123.txt-MALFORMED QUERY: Not a valid (absolute) IRI: ex069.ttl
ex126.txt-MALFORMED QUERY: Not a valid (absolute) IRI: ex125.ttl
ex128.txt-MALFORMED QUERY: Not a valid (absolute) IRI: ex125.ttl
ex130.txt-MALFORMED QUERY: Not a valid (absolute) IRI: ex069.ttl
ex135.txt-MALFORMED QUERY: Not a valid (absolute) IRI: ex134.ttl
ex172.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
ex178.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
ex180.txt-MALFORMED QUERY: Not a valid (absolute) IRI: ex125.ttl
ex196.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
ex308.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
ex474.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
ex475.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
ex476.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
ex539.txt-<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.46 - Error report</title><style type=
  • "<ex002.ttl>"といったURIに未対応。(ex007.rq - ex180.rq)
  • ex308.rqはARQ独自関数利用のため。
  • ex492.rqについては、期待される結果とは異なっている。("==== No variables ====")
  • また、DBpediaの返すリテラル値にrdf:langString型があるが、言語タグが付いていないことでエラー(500 Internal Server Error)になっている(参考)。ただ、このエラーに対するHTTPステータスが500なのはどうなのか。

rdfstore-js 0.8.1

$ foreach f ( ../LearningSPARQL2ndEx/ex*.rq )
set a=`basename $f .rq`
./bin/rsparql --service 'http://xxx/sparql' --query ${f} --debug >& ../LearningSPARQL2ndEx_rdfstore-js0.8.1/${a}.txt
end
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   119 ==== No variables ====
    56 com.hp.hpl.jena.query.QueryException: Endpoint returned Content-Type: application/rdf+xml which is not currently supported for SELECT queries
    16 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
     4 HTTP Exeception
     2 com.hp.hpl.jena.query.QueryException: Endpoint returned Content-Type: application/rdf+xml which is not currently supported for ASK queries
     2 12:00:33 ERROR riot                 :: Content is not allowed in prolog.
     2 12:00:31 ERROR riot                 :: Content is not allowed in prolog.
     1 Ask => No
     1 12:01:45 ERROR riot                 :: Content is not allowed in prolog.
     1 12:01:32 ERROR riot                 :: Content is not allowed in prolog.
     1 12:01:28 ERROR riot                 :: Content is not allowed in prolog.
     1 12:01:00 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:55 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:50 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:47 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:46 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:45 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:44 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:42 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:34 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:32 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:30 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:29 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:26 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:23 ERROR riot                 :: Content is not allowed in prolog.
     1 12:00:20 ERROR riot                 :: Content is not allowed in prolog.

SPIN API 1.3.1-1.3.2

TopBraidにより提供されているSPIN APIに対し、他の実装で試した全てのクエリを処理させ、適切にRDFへの変換、及び逆変換がなされるかを試した。 結果は全て問題なく処理された。

このテストを行うために、上記URLより取得出来るライブラリ(spin-1.3.1-distribution.zip, spin-1.3.2-distribution.zip)とapache-jena-2.11.0.zipを利用している。 前者のパッケージに含まれているサンプルプログラムSPINParsingExample.javaを参考にし、標準入力からクエリを受け付け、SELECTだけでなく、ASK、CONSTRUCT、DESCRIBEも処理可能な仕様にした。 なお、サンプルプログラムのままではSELECTクエリのみが対応可能なので、com.hp.hpl.jena.query.Queryクラスのメソッド、isAskTypeなどを利用してクエリの型を判定する形にした。

Stardog 5.2.3 - 5.3.6

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://ep:21200/myDB/query --query=${f} --debug >& ../LearningSPARQL2ndEx_Stardog_5.2.3/${o}.txt ; done'
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   176 -
    12 @prefix ab:    <http://learningsparql.com/ns/addressbook#> .
     4 <http://www.Department0.University0.edu>
     3 HTTP Exeception
     3 Ask => No
     3 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
     2 @prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
     2 @prefix dm:    <http://learningsparql.com/ns/demo#> .
     2 @prefix dcterms: <http://purl.org/dc/terms/> .
     2 @prefix d:     <http://learningsparql.com/ns/data#> .
     1 @prefix spin:  <http://spinrdf.org/spin#> .
     1 @prefix skos:  <http://www.w3.org/2004/02/skos/core#> .
     1 @prefix owl:   <http://www.w3.org/2002/07/owl#> .
     1 @prefix nn:    <http://learningsparql.com/new/namespace/> .
     1 @prefix im:    <http://learningsparql.com/ns/importedData#> .
     1 @prefix dc:    <http://purl.org/dc/elements/1.1/> .
     1 ==== No variables ====
$ grep -A2 'HTTP Exeception' *.txt | grep -v 'HTTP Exeception' | grep -v '^--' | grep -v 'HttpException' | sed -e 's/^/ /'
ex474.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex476.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
ex539.txt-     at org.apache.jena.sparql.engine.http.HttpQuery.rewrap(HttpQuery.java:371)
  • 一部DBpediaに対するService句が失敗。おそらくDBpedia(つまりVirtuoso?)が返すヘッダー情報の問題と思われるが、はて。
  • ex492.rqについては、期待される結果とは異なっている。("==== No variables ====")

Virtuoso (VOS) 7.2.0 - 7.2.5 on Linux

$ sh -c 'for f in ../LearningSPARQL2ndEx/ex*.rq ; do o=`basename $f .rq`; ./bin/rsparql --service=http://ep:21600/sparql --query=${f} --debug >& ../LearningSPARQL2ndEx_Virtuoso_7.2.4/${o}.txt ; done'
$ foreach f ( ../LearningSPARQL2ndEx/ex*.rq )
set a=`basename $f .rq`
./bin/rsparql --service 'xxx' --query ${f} --debug >& ../LearningSPARQL2ndEx_Virtuoso_7.2.0/${a}.txt
end
$ head -1 *.txt | grep -v '^==>' | sed -ne '/^./p' | sed -e 's/^--*/-/' | sort | uniq -c | sort -nr
   173 -
    33 @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
     6 HTTP Exeception
     3 Ask => No
     1 14:49:41 WARN  riot                 :: Lexical form '1860-01-01+02:00' not valid for datatype http://www.w3.org/2001/XMLSchema#gYear
     1 14:48:12 ERROR riot                 :: {E211} Base URI is null, but there are relative URIs to resolve.: <http%3A%2F%2Fwww.openlinksw.com%2Fschemas%2Fvirtrdf%23QuadMapFormat>
     1 14:48:11 ERROR riot                 :: {E211} Base URI is null, but there are relative URIs to resolve.: <http%3A%2F%2Fwww.openlinksw.com%2Fschemas%2Fvirtrdf%23QuadMapFormat>
     1 14:47:45 WARN  riot                 :: Lexical form '1860-01-01+02:00' not valid for datatype http://www.w3.org/2001/XMLSchema#gYear
     1 14:47:10 WARN  riot                 :: Lexical form '1860-01-01+02:00' not valid for datatype http://www.w3.org/2001/XMLSchema#gYear
$ grep -A2 'HTTP Exeception' *.txt | grep 'HttpException' | sed -e 's/^/ /'
ex118.txt-HttpException: 500 SPARQL Request Failed
ex262.txt-HttpException: 500 SPARQL Request Failed
ex308.txt-HttpException: 500 SPARQL Request Failed
ex492.txt-HttpException: 500 SPARQL Request Failed
ex510.txt-HttpException: 500 SPARQL Request Failed
ex511.txt-HttpException: 500 SPARQL Request Failed

7.1.0からの大きな違いはURI関数が追加された点。その他以下の点については変化無し。

  • ex118.rqについては、OFFSETだけではどうやらダメらしく、LIMITと同時使用なら問題無し。
  • ex262、ex510、ex511は関数の引数について型が合っていないとエラーになる。
  • ex308.rqはARQの独自関数利用のため。
  • ex492.rqについては恐らく、VALUESがWHERE外にある場合に未対応のため。

個人用ツール