forked from kasei/perlrdf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
README.html
1249 lines (1248 loc) · 81.8 KB
/
README.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>RDF::Query</title>
<style type="text/css">
.list {
display: block;
margin: 0 2em;
font-family: monospace;
}
</style>
</head>
<body>
<h1>RDF::Query - A SPARQL/RDQL implementation for RDF::Trine.</h1>
<p>RDF::Query allows RDQL and SPARQL queries to be run against an RDF model, returning rows of matching results.</p>
<h2>Requirements</h2>
<p>To install RDF::Query you'll need the following perl modules installed:</p>
<ul>
<li>Data::UUID</li>
<li>Digest::SHA</li>
<li>DateTime</li>
<li>DateTime::Format::W3CDTF</li>
<li>Error</li>
<li>File::Spec</li>
<li>File::Temp</li>
<li>I18N::LangTags</li>
<li>JSON</li>
<li>List::Util</li>
<li>LWP</li>
<li>Parse::RecDescent</li>
<li>RDF::Trine</li>
<li>Scalar::Util</li>
<li>Set::Scalar</li>
<li>Storable</li>
<li>URI</li>
</ul>
<p>The following additional modules are recommended for some functionality:</p>
<ul>
<li>RDF::Redland</li>
<li>Geo::Distance</li>
</ul>
<h2 id="installing">Installing RDF::Query</h2>
<p>To install, run:</p>
<div class="list">
perl Makefile.PL<br />
make<br />
make test<br />
make install<br />
</div>
<h2 id="changelog">Version History</h2>
<h3 id="v2_907">Version 2.907 (2011-06-04)</h3>
<ul>
<li>Bug Fixes
<ul>
<li>Fixed bug in SPARQL 1.1 parser for DESCRIBE queries without a WHERE clause.</li>
<li>Fixed join ordering bug for queries with a BINDINGS clause and several joins.</li>
<li>Fixed RDF::Query->as_sparql for DESCRIBE queries which project URI terms, not variables.</li>
</ul></li>
<li>Other
<ul>
<li>Fixed expected test results for DESCRIBE queries without a WHERE clause.</li>
<li>examples/query.pl now emits a warning if the query object cannot be constructed.</li>
</ul></li>
</ul>
<h3 id="v2_906">Version 2.906 (2011-05-14)</h3>
<ul>
<li>API Changes
<ul>
<li>Globally changed 'base' to 'base_uri' in code and API.</li>
</ul></li>
<li>Bug Fixes
<ul>
<li>Fixed SPARQL serialization in RDF::Query::Plan generation of SERVICE blocks to always include braces around the query body.</li>
<li>Fixed SPARQL 1.1 parsing bug in property paths using alternatives ('|').</li>
<li>Fixed SPARQL 1.1 bug in parsing prefixnames where a graph term is expected.</li>
<li>Fixed bug in ZeroOrMore reverse path handling (patterns matching { var path* term }).</li>
<li>Fixed bug in RDF::Query::Node::Literal::_cmp that was causing wrong node comparison results.</li>
<li>Fixed bug in parsing solution modifiers in CONSTRUCT and DESCRIBE queries.</li>
<li>Fixed bug in handling of unbound variables in delete templates in RDF::Query::Plan::Update.</li>
<li>Fixed bug in calls to RDF::Query->var_or_expr_value that was preventing use of EXISTS filters in project expressions.</li>
</ul></li>
<li>New Features
<ul>
<li>Updated RDF::Query::Plan::Iterator->new to allow passing in a callback that will return an iterator, instead of an iterator directly.</li>
<li>Updated RDF::Query->query_plan to delegate entire queries to the RDF::Trine::Model when possible.</li>
<li>Updated bin/deparse.pl to allow specifying an endpoint url for SPARQL-backed models (which can affect the query plan).</li>
<li>Added support for empty SPARQL 1.1 Update sequence operations (allowing no-op updates).</li>
<li>Added options to RDF::Query->new to allow forcing RDF::Query to disable query delegation to the underlying store.</li>
<li>Added option to RDF::Query::Util::cli_parse_args to specify arbitrary options to be supplied to the RDF::Query->new constructor.</li>
<li>Added new, cleaner line-based "explain" format for serializing query Plan and Algebra objects.</li>
<li>Added bindings accessor and is_unit method to RDF::Query::Plan::Constant.</li>
<li>Added ability to forcibly remove a particular join algorithm from consideration in plan generation.</li>
<li>Added 'execute' command in rqsh to allow loading a query from a file or URL.</li>
</ul></li>
<li>Enhancements
<ul>
<li>Updated SPARQL 1.1 parser to prevent bnode use in DELETE blocks.</li>
<li>Updated rqsh to associate common filename extensions with media types (helps in loading local files).</li>
<li>Updated RDF::Query::Plan::Path to align with new ALP algorithm from the spec text.</li>
<li>Added some simple statistics generation code in RDF::Query::Plan::Join subclasses.</li>
<li>Added missing implementation for property paths using {n,} modifier syntax.</li>
<li>Added code to guard against mishandling unbound/blank/variable nodes in DELETE templates in RDF::Query::Plan::Update.</li>
</ul></li>
<li>Other
<ul>
<li>Updated tests to use new RDF::Trine::Iterator->seen_count method instead of deprecated count method.</li>
<li>Updated serialization text for zero-length paths in RDF::Query::Plan::Path->plan_node_data.</li>
<li>Removed warning of unknown options passed to RDF::Query->new.</li>
<li>Removed unused projection code in RDF::Query->execute_plan.</li>
<li>Removed Digest::SHA1 from prereq modules, and updated code to use Digest::SHA instead.</li>
<li>Remove the meaningless "All rights reserved" copyright text.</li>
<li>Fixed test count in t/sparql11-propery_paths.t.</li>
<li>Commented out noisy debugging output in RDF::Query::Plan::Path.</li>
<li>Added trace debugging in RDF::Query::Plan::Sort.</li>
<li>Added options instance variable to RDF::Query::ExecutionContext.</li>
<li>Added Module::Pluggable to list of required modules in Makefile.PL.</li>
<li>Added mappings from file extensions to media types in dawg test scripts.</li>
<li>Various updates to SPARQL 1.1 dawg test harness scripts.</li>
</ul></li>
</ul>
<h3 id="v2_905">Version 2.905 (2011-02-18)</h3>
<ul>
<li>Bug Fixes
<ul>
<li>Fixed mistaken case sensitivity of COALESCE, BNODE, CONCAT, and SUBSTR keywords in SPARQL 1.1 parser.</li>
<li>Fixed parsing ambiguity between MIN aggregate and MINUTES function.</li>
<li>Fixed Xpath fn:timezone-from-dateTime function return for UTC timezones.</li>
<li>Fixed RDF::Query::Algebra::Project->as_sparql handling of binary select expressions.</li>
<li>Fixed RDF::Query::Algebra::Construct->sse serialization to include construct triples.</li>
<li>Updated handling of BIND() to not close group scope (which was applying filters in the wrong place).</li>
<li>Fixed RDF::Query::Parser::SPARQL11 to handle whitespace between tokens in 'INSERT DATA' and 'DELETE DATA'.</li>
<li>Fixed RDF::Query::Parser::SPARQL11 to handle empty ModifyTemplates.</li>
<li>Fixed SPARQL 1.1 parser to properly set relevant datasets for update operations.</li>
<li>Fixed plan code for zero-length paths to return RDF::Query::Node-based results (not Trine-based).</li>
<li>Fixed bug in RDF::Query::Plan::Clear when attempting to clear the default graph.</li>
<li>Fixed exception throwing on numeric binary expression eval without numeric literal arguments.</li>
<li>Updated RDF::Query::Plan to handle update operations with different datasets for matching (USING clause).</li>
</ul></li>
<li>New Features
<ul>
<li>Added SPARQL 1.1 numeric functions: ABS, CEIL, FLOOR, ROUND, RAND</li>
<li>Added SPARQL 1.1 string functions: CONCAT, SUBSTR, STRLEN, UCASE, LCASE, ENCODE_FOR_URI, CONTAINS, STRSTARTS, STRENDS</li>
<li>Added SPARQL 1.1 date functions: NOW, TIMEZONE, TZ, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS</li>
<li>Added SPARQL 1.1 hashing functions: MD5, SHA1, SHA224, SHA256, SHA384, and SHA512</li>
<li>Added RDF::Query::Functions->install_function method, and implementations for fn:compare, fn:concat, and fn:substring.</li>
<li>Updated RDF::Query->execute_with_named_graphs to accept optional arguments to be passed to C<< execute >>.</li>
<li>Added support for CONSTRUCT WHERE syntax shortcut.</li>
<li>Added support for SILENT modifier to SERVICE patterns.</li>
<li>Added SILENT flag in RDF::Query::Algebra::Service.</li>
<li>Added initial code to create SPIN serializations of queries.</li>
<li>Added RDF::Query::Node::Literal->type_list method.</li>
</ul></li>
<li>Enhancements
<ul>
<li>Updated xt/dawg-syntax11.t to find more syntax queries in the dawg test data.</li>
<li>SPARQL 1.1 parser now throws errors for more classes of syntactically invalid queries (repeated expression aliases, wrong number of BINDINGS values, SELECT * with use of grouping).</li>
<li>Added support for non-strict comparisons of xsd:strings in RDF::Query::Node::Literal (based on $LAZY_COMPARISONS variable).</li>
</ul></li>
<li>Other
<ul>
<li>Major refactor of xt/dawg-eval11.t test harness.</li>
<li>Updated required version of Test::More to 0.88 (0.86 doesn't have done_testing() used in t/store-config.t).</li>
<li>Updated RDF::Query::Expression::Function->evaluate to throw an error if no function coderef is found.</li>
</ul></li>
</ul>
<h3 id="v2_904">Version 2.904 (2010-11-23)</h3>
<ul>
<li>Added 'set prefix' and 'time' commands to rqsh.</li>
<li>Added string concatenation overloading of binary +.</li>
<li>Fixed bug in property path evaluation on encountering blank path nodes.</li>
<li>Fixed use of binary '*' in FILTER without numeric data in t/resultforms.t.</li>
<li>Fixed bin/dawg11-status.pl to only load SPARQL 1.1 earl result files.</li>
<li>Fixed RDF::Query::Plan::Update to ignore non-ground triples (unbound variables don't act as wildcards).</li>
<li>Fixed handling of named graph data in insert/delete patterns of update operations.</li>
<li>Updated RDF::Query::Util to use RDF::Trine::Model->temporary_model and guess an appropriate parser based on filenames.</li>
<li>Updated namespace URI in RDF::Query::Functions::Jena to <http://jena.hpl.hp.com/ARQ/function#>.</li>
<li>Updated namespace URI in RDF::Query::Functions::Xpath to <http://www.w3.org/2005/xpath-functions#>.</li>
<li>Updated xt/dawg-eval11.t to align with updated test case manifest schemas.</li>
<li>Updated xt/dawg-eval11.t to prevent test cases with missing files from emitting failures (now skipped).</li>
<li>Added xpath function implementations.</li>
<li>Added SPARQL 1.1 Update shortcut syntax support for COPY, MOVE, and ADD graph operations.</li>
<li>Fixed bug in RDF::Query::Plan::Construct that wasn't giving each result a new set of blank nodes (RT 63155).</li>
<li>Updated SYNOPSIS and execute() and execute_plan() methods POD (RT 63153 comment from Ivan Shmakov).</li>
<li>Updated documentation to explicitly discuss inherited methods due to subclassing.</li>
<li>Fixed RDF::Query::Algebra::Sequence->sse to serialize operations in proper order.</li>
<li>Added $silent argument to RDF::Query::Algebra::Clear constructor.</li>
</ul>
<h3 id="v2_903">Version 2.903 (2010-11-03)</h3>
<ul>
<li>SPARQL 1.1
<ul>
<li>New features
<ul>
<li>Added support for BIND(expr AS ?var) operator.</li>
<li>Added isNumeric built-in function, checking for proper datatype and valid lexical forms for numerics.</li>
</ul>
</li>
<li>Updates
<ul>
<li>Updated SPARQL 1.1 parser to handle WITH clauses with PrefixedNames.</li>
<li>SPARQL 1.1 parser now sets error and returns if no query string is supplied.</li>
<li>Added more exception handling in RDF::Query::Parser::SPARQL11.</li>
<li>Updated CLEAR and DROP handling in SPARQL 1.1 parser and engine to handle 'NAMED' and 'ALL' variants.</li>
<li>Renamed 'binding_variables' methods to 'potentially_bound' to align with current SPARQL 1.1 terminology.</li>
<li>Results returned by property path plans are now RDF::Query::VariableBindings objects and are properly projected.</li>
<li>The query planner now interprets simple paths as basic graph patterns.</li>
<li>Removed Algebra and Plan classes for Not and Exists operations (now handled in other classes).</li>
<li>Updated RDF::Query::Plan::Extend to drop the extended variable binding if evaluating the extension yields an error.</li>
<li>Updated RDF::Query::Plan::Update to accept delete patterns with variables.</li>
<li>Updated subquery plan objects to use a sub-plan, not a full query object.</li>
</ul>
</li>
<li>Bug fixes
<ul>
<li>Fixed SPARQL 1.1 parser bug that was returning partial data from a failed parse call.</li>
<li>Fixed SPARQL 1.1 parser bug for queries with multiple FILTERs in a GGP including an EXISTS filter.</li>
<li>Fixed SPARQL 1.1 parser bug for DROP/CLEAR queries.</li>
<li>Fixed SPARQL 1.1 parser typo of 'SEPARATOR' argument to GROUP_CONCAT aggregate.</li>
<li>Fixed SPARQL 1.1 parser to handle FITLERS to the left of MINUS/OPTIONAL and allow projecting '*' with other vars/epressions.</li>
<li>Fixed SPARQL 1.1 parser case sensitivity of project expression 'AS' token.</li>
<li>Fixed SPARQL 1.1 parser handling of of subqueries within GRAPH blocks.</li>
<li>Fixed miscellaneous bugs and improved performance of parsing SPARQL 1.1 queries.</li>
<li>Made parsing of very large triple blocks non-recursive in SPARQL 1.1 parser.</li>
<li>Fixed COALESCE function to handle errors properly.</li>
<li>Fixed RDF::Query::Plan::Aggregate to extend results using AliasExpressions from HAVING clauses.</li>
<li>Fixed bug that was ignoring GROUP BY clauses when no aggregate operations were present.</li>
<li>Fixed bad looping on start node of unbounded property paths.</li>
<li>Fixed bug in query planning of '^' property paths.</li>
<li>Fixed zero-length property path evaluation within GRAPH blocks.</li>
<li>Removed plan duplication of zero-length case in '*' property paths.</li>
<li>Fixed handling of named graphs within subqueries (changes to active graph handling in the query planner).</li>
<li>Fixed type-promotion and handling of numeric types in aggregate handling.</li>
<li>Fixed RDF::Query::Algebra::Update->as_sparql to handle INSERT/DELETE updates properly.</li>
<li>Fixed RDF::Query::Plan::Aggregate->sse to allow handling of (non-blessed, scalar) '*' columns.</li>
</ul>
</li>
</ul>
</li>
<li>Query Engine
<ul>
<li>Added ability to pass through arguments to the query planner in RDF::Query->prepare.</li>
<li>Updated RDF::Query::Node::Literal::_cmp to handle literals that fail to parse as DateTime objects.</li>
<li>Updated RDF::Query::Plan::Limit to use the limit accessor internally.</li>
<li>RDF::Query::Plan::NamedGraph now uses lazy iterator for graph names.</li>
<li>Updated RDF::Query::VariableBindings to subclass the new RDF::Trine::VariableBindings.</li>
<li>RDF::Query::Algebra::Project now implements bind_variables().</li>
<li>Updated RDF::Query->describe to use $model->bounded_description instead of simply outgoing arcs.</li>
<li>Fixed bug in evaluation of function expressions in which the execution context object was lost (causing EXISTS filters to fail).</li>
<li>Fixed optimization of COUNT(*) over 1-triple BGPs to keep the variable binding for the pseudo-variable ?COUNT(*).</li>
<li>Fixed sse serialization in RDF::Query::Algebra::Distinct.</li>
<li>Fixed RDF::Query::Plan::Join::PushDownNestedLoop to close sub-plans in close() method.</li>
</ul>
</li>
<li>rqsh - RDF::Query Shell
<ul>
<li>Added ability to show the parsed algebra with 'parse' command.</li>
<li>Added abiility to show the query execution plan with the 'explain' command.</li>
<li>Added ability to change the RDF serializer with the 'serializer' command.</li>
<li>Added ability to initialize new stores with the 'init' command.</li>
<li>Added ability to change underlying store with the 'use' command.</li>
<li>Added 'help' command.</li>
<li>Updated packaging to install rqsh script (renamed from old bin/rqsh.pl).</li>
<li>Updated to catch errors thrown while trying to create new storage backends (e.g. DBI->connect failing).</li>
<li>rqsh now defaults to read-write models.</li>
<li>rqsh now sets a base URI for the current working directory.</li>
<li>Password input now doesn't echo to the terminal.</li>
<li>Filename input now autocompletes via Term::ReadLine.</li>
</ul>
</li>
<li>Warning and Error Handling
<ul>
<li>Replaced calls to die with throwing exceptions.</li>
<li>RDF::Query->new now warns about unrecognized options.</li>
<li>DATATYPE() now throws an exception unless passed a valid node object.</li>
<li>RDF::Query::Expresion::Binary now throws exceptions on numeric comparisions with non-numeric operands.</li>
<li>Fixed error message in RDF::Query::Plan::NamedGraph.</li>
<li>Added trace debugging to RDF::Query::Plan::Union.</li>
<li>Added trace debugging to RDF::Query::Plan::Project.</li>
<li>Added trace debugging to RDF::Query::Plan::Path.</li>
</ul>
</li>
<li>Tests and Miscellany
<ul>
<li>Added SPARQL 1.1 syntax and eval test harnesses.</li>
<li>Fixed bug in xt/dawg-eval11.t parsing of srx files containing literal values that evaluate to false in perl (e.g. '0').</li>
<li>Fixed turtle output for rdfs:comments in xt/dawg/earl.pl.</li>
<li>Moved developer tests from t/ to xt/.</li>
<li>Refactored RDF::Query::Functions into several auto-loaded sub-packages via Module::Pluggable (patch from tobyink).</li>
<li>Removed references to the now-deprecated mac.com in network-based tests.</li>
<li>Updated expected values in t/queryform-describe.t for results using bounded descriptions.</li>
<li>Updated RDF::Query::Util to look for .prefix-cmd cache of common namespace names.</li>
<li>Updated RDF::Query::Util::cli_parse_args to accept '-r' as a read-only flag.</li>
<li>Updated required version of RDF::Trine to 0.126.</li>
<li>Updated to use URI 1.52 to allow direct usage of IRIs without unicode workarounds.</li>
<li>Made code updates to improve performance based on profiling.</li>
</ul>
</li>
</ul>
<h3 id="v2_902">Version 2.902 (2010-07-02)</h3>
<ul>
<li>Fixed bug in requiring prerequisite modules.</li>
</ul>
<h3 id="v2_901">Version 2.901 (2010-06-29)</h3>
<ul>
<li>Fixed named graph handling.</li>
<li>Fixed bug in handling of * aggregates.</li>
<li>Simplified code to create new temporary models when FROM clauses dereference graph data.</li>
<li>Added support for SPARQL 1.1 CREATE/DROP GRAPH update operations.</li>
<li>Fixed infinite loop bug on parsing certain invalid SPARQL 1.1 update queries.</li>
<li>Fixed handling of BGPs within named graphs in RDF::Query::Plan::BasicGraphPattern.</li>
<li>Updated syntax error exception messages in SPARQL parsers.</li>
<li>Fixed property path evaluation within named graphs.</li>
<li>Converted Makefile.PL to properly use Module::Install.</li>
</ul>
<h3 id="v2_900">Version 2.900 (2010-06-23)</h3>
<ul>
<li>Major Changes
<ul>
<li>SPARQL 1.1 is now the default query parser.</li>
<li>RDF::Core is no longer supported as a backend triplestore.</li>
<li>Redland is still supported as a backend store, but updated handling of default and named graphs means that existing triples stored in Redland without a context (named graph) will not be accessible from RDF::Query.</li>
</ul>
</li>
<li>SPARQL Language Updates
<ul>
<li>Added support for SPARQL 1.1 Query features:
<ul>
<li>Basic Query Federation with BINDINGS and UNDEF support.</li>
<li>Functions: IF, STRDT, STRLANG, IRI, URI, BNODE.</li>
<li>Infix operators IN and NOT IN.</li>
<li>Aggregates COUNT, SUM, MIN, MAX, AVG, GROUP_CONCAT, and SAMPLE.</li>
<li>Property paths.</li>
<li>Negation with MINUS graph patterns and NOT EXISTS filters.</li>
</ul>
</li>
<li>Added support for SPARQL 1.1 Update features:</li>
<ul>
<li>INSERT/DELETE DATA, INSERT/DELETE WHERE, LOAD, and CLEAR</li>
<li>Added support for multi-statement updates.</li>
</ul>
</li>
</ul>
</li>
<li>API Updates
<ul>
<li>Removed all bridge classes (RDF::Query::Model::*).</li>
<li>Removed RDF::Query::Logger class.</li>
<li>Removed net filter function code from RDF::Query.</li>
<li>Added as_hash method to Query, Algebra, and Node classes.</li>
<li>Removed SPARUL and SPARQLP parsers.</li>
<li>RDF::Query no longer loads URIs in FROM and FROM NAMED clauses with SPARQL 1.1 by default.</li>
<li>Added ability for RDF::Query::Plan::Iterator to fire a callback when execute() is called.</li>
<li>Added new RDF::Query::Plan::ComputedStatement class.</li>
<li>Added new RDF::Query::Plan::Iterator class.</li>
</ul>
</li>
<li>Bugfixes
<ul>
<li>Fixed whitespace unescaping bug in SPARQL (1.0 and 1.1) parsers.</li>
</ul>
</li>
<li>Scripts
<ul>
<li>Added bin/json.pl to print a JSON-formatted representation of the query algebra.</li>
<li>Added bin/rqsh.pl CLI interface to executing updates and queries.</li>
<li>Added ability to serialize algebra and plan in bin/deparse.pl.</li>
<li>bin/deparse.pl now catches parsing errors and prints stacktrace.</li>
</ul>
</li>
<li>Optimizations
<ul>
<li>Implemented optimization for COUNT(*) over a single triplepattern.</li>
</ul>
</li>
</ul>
<h3 id="v2_202">Version 2.202 (2010-05-22)</h3>
<ul>
<li>Added initial SPARQL 1.1 syntax and eval support for select expressions, subqueries, negation, aggregates, subqueries, and basic federation.</li>
<li>Added RDF::Query::VariableBindings.pm->set method.</li>
<li>Added RDF::Query::_new constructor without any sanity or setup code (used for subquery construction).</li>
<li>Added RDF::Query::Node::Blank::new constructor to avoid RDF::Trine's N-Triples syntax requirements.</li>
<li>Added SAMPLE and GROUP_CONCAT aggregate support.</li>
<li>Added shortcut functions for constructing RDF::Query::Node objects and Algebra Triples, BGPs and GGPs.</li>
<li>Added warning to RDF::Query::Algebra::Project constructor for improper variable lists.</li>
<li>Updated DAWG tests to use SPARQL 1.1 parser.</li>
<li>Removed SPARQLP aggregate tests that don't align with new SPARQL 1.1 semantics.</li>
<li>Updated DAWG eval tests to skip non-approved tests.</li>
<li>Fixed handling of unicode decoding in DAWG eval tests.</li>
<li>Bumped required version of RDF::Trine to 0.123.</li>
<li>Updated t/models.pl to use RDF::Trine::Parser->parse_url_into_model method and redland's 'guess' parser.</li>
<li>Fixed logging key name in RDF::Query::Plan::Exists.</li>
<li>Fixed sse and as_sparql methods in RDF::Query::Algebra::Exists.</li>
<li>Implemented RDF::Query::Algebra::Exists::binding_variables.</li>
<li>Updated BGPOptimizer to estimate selectivity directly instead of using costmodel code.</li>
<li>Removed costmodel code.</li>
<li>Removed unused fixup and execute methods in Algebra classes.</li>
<li>Updated RDF::Query to only instantiate DateTime parser and LWP::UserAgent if needed.</li>
<li>Changed DBPedia network test to align with recent DBPedia update in t/dev-service-description.</li>
<li>Updated SPARQLP parser tests to align with internal changes in RDF::Query::Algebra::Aggregate.</li>
<li>Updated RDF::Query::Algebra::Aggregate and RDF::Query::Plan::Aggregate to syntactically handle HAVING clauses.</li>
<li>Fixed bin/graph-bgp.pl (had bitrotted).</li>
<li>Changed bnodes to named variables in examples/queries/sparql-bgp-people-knows.rq.</li>
<li>RDF::Query::Util::cli_make_query now defaults the 'class' parameter to 'RDF::Query'.</li>
<li>Removed dependency list and added perlrdf link to POD in RDF::Trine and RDF::Query.</li>
</ul>
<h3 id="v2_201">Version 2.201 (2010-01-30)</h3>
<ul>
<li>Added benchmark/lubm.pl.</li>
<li>Added examples/queries/sparql-ask-people.rq.</li>
<li>Added RDFa tests.</li>
<li>Added Data::UUID prerequisite to META.yml and Makefile.PL.</li>
<li>Updated ::Model::RDFTrine::add_uri and ::add_string to use new RDF::Trine::Parser methods.</li>
<li>Updated as_sparql and sse code to work with more recent RDF::Trine versions.</li>
<li>Removed as_sparql caching in RDF::Query::Algebra::Triple.</li>
<li>Renamed RDF::Query test files to remove old-style numbering.</li>
<li>Updated parser tests to track new RDF::Trine::Node::Literal internal structure.</li>
<li>Updated prereq version of RDF::Trine to 0.114.</li>
<li>Fixed NAME POD section in RDF::Query::ServiceDescription (RT52264 from KjetilK).</li>
</ul>
<h3 id="v2_200">Version 2.200 (2009-08-06)</h3>
<ul>
<li>Federation / Service Descriptions
<ul>
<li>Rewrote the optimistic plan generator in RDF::Query::Federate::Plan.</li>
<li>Added threshold timeout argument to RDF::Query::Plan::ThresholdUnion and support for it in RDF::Query::Federate::Plan.</li>
<li>Simplified logging in RDF::Query::Federate::Plan (now only logs to category 'rdf.query.federate.plan').</li>
<li>RDF::Query::ServiceDescription now adds an 'origin' label annotations to RDF::Query::Algebra::Triple objects.</li>
<li>Removed check of the sd:definitive property in RDF::Query::ServiceDescription (was based on wrong assumptions).</li>
<li>Updated RDF::Query::ServiceDescription::answers_triple_pattern() to recognize wildcard capabilities, constructor now adds wildcard by default.</li>
<li>Added new RDF::Query::ServiceDescription::new_with_model constructor.</li>
<li>RDF::Query::ServiceDescription::computed_statement_generator now returns empty iterators when passed triple patterns with bound blank nodes.</li>
<li>Added test data in data/federation_data/.</li>
<li>RDF::Query::Plan::Service now adds an 'origin' label annotation to the RDF::Query::VariableBindings object.</li>
<li>Added 'optimistic_threshold_time' query flag to RDF::Query::ExecutionContext and RDF::Query constructor.</li>
<li>RDF::Query::Federate::add_service() now adds the appropriate computed statement generators to the query object.</li>
<li>Removed optimistic query rewriting test from t/34-servicedescription.t (now covered by t/federate.t).</li>
<li>Added t/federate.t with tests for optimistic federated query optimization using ::Plan::ThresholdUnion and RDF::Endpoint::Server.</li>
</ul>
</li>
<li>Aggregates
<ul>
<li>Fixed serialization quoting issue in RDF::Query::Algebra::Aggregate::sse().</li>
<li>RDF::Query::Plan::Aggregate now attempts plain string comparisons for MIN,MAX when strict_errors is not set.</li>
<li>Added support for average aggregates, and fixed datatype support in aggregates.</li>
</ul>
</li>
<li>Command Line Inferface
<ul>
<li>Added bin/query.pl, a fork of examples/query.pl, to support simple query execution.</li>
<li>Added RDF::Query::Util as home to helper functions (added CLI args parsing functions to create queries and models).</li>
<li>Simplified CLI argument parsing in bin/ and examples/ programs.</li>
</ul>
</li>
<li>Refactoring, Code Cleanup, and Documentation
<ul>
<li>Added and updated POD to RDF::Query::Util, RDF::Query::Node and RDF::Query::Plan and RDF::Query::Federate::Plan.</li>
<li>Added check for RDFQUERY_THROW_ON_SERVICE environment variable in RDF::Query::Plan::Service.</li>
<li>Cleaned up code in RDF::Query::Model::get_computed_statements().</li>
<li>Updated SSE formatting and uninitialized warning in RDF::Query::Plan, RDF::Query::Algebra::Filter, RDF::Query::Algebra::Distinct and RDF::Query::Algebra::Sort.</li>
<li>Moved shared RDF::Trine-related model methods into RDF::Query::Model from subclasses.</li>
<li>Raised required RDF::Trine version to 0.111 which brings RDF::Trine::Graph support.</li>
<li>RDF::Query::Model::RDFTrine::BasicGraphPattern::execute now returns $self.</li>
<li>Removed dependency on Test::JSON, List::MoreUtils, and XML::Parser.</li>
<li>Removed TODO on test in t/29-serialize.t.</li>
<li>Removed unnecessary code in RDF::Query::Plan subclasses, bin/query.pl, bin/graph-bgp.pl and bin/graph-query.pl.</li>
</ul>
</li>
<li>Logging
<ul>
<li>Added logging in RDF::Query::Plan::ThresholdUnion, and RDF::Query::Model.</li>
<li>Changed logging level from debug to trace in RDF::Query::Plan::Triple, RDF::Query::Plan::Project, RDF::Query::Plan::Filter, RDF::Query::Plan::Join::NestedLoop, RDF::Query::Plan::PushDownNestedLoop, and RDF::Query::Model::RDFTrine.</li>
<li>Added calls to Log::Log4perl::is_debug to eliminate unnecessary serialization of logging when not in use.</li>
<li>Made error message more useful when SERVICE calls fail in RDF::Query::Plan::Service.</li>
</ul>
</li>
<li>Bugfixes
<ul>
<li>Fixed bug in RDF::Query::Plan::Offset in cases where the offset was beyond the end of the result set.</li>
<li>Fixed testing for Bloom::Filter in t/31-service.t.</li>
<li>Fixed test expectations when making remote DBPedia query in t/34-servicedescription.t.</li>
<li>Fixed check of $ENV{RDFQUERY_NETWORK_TESTS} to test boolean value, not just existence.</li>
<li>Fixed (bad) expected serializations in t/29-serialize.t.</li>
<li>Fixed bug in RDF::Query::Plan::ThresholdUnion attempting to close an iterator twice.</li>
<li>Fixed sse serialization issues in RDF::Query::Algebra::BasicGraphPattern and RDF::Query::Algebra::Project.</li>
<li>Fixed bug in RDF::Query::Node::from_trine() that up-cast blank nodes to variables.</li>
<li>Fixed quoting issue in RDF::Query::Algebra::Service::sse().</li>
<li>Fixed parameter handling in bin/graph-qeps.pl:prune_plans().</li>
<li>Fixed handling of 'GRAPH ?g {}' (empty GraphGraphPatterns) to return all graph names.</li>
<li>Added check for ref($node) in RDF::Query::VariableBindings::new (broke code after previous removal of blessed() check).</li>
<li>Added use of defined() in code that had been testing boolean value of objects (and causing expensive string overloading).</li>
</ul>
</li>
<li>Miscellaneous Changes
<ul>
<li>Added examples of queries and service descriptions in examples/.</li>
<li>Updated dawg-eval.t to actually test graph equivalence.</li>
<li>Clarified graph labels in RDF::Query::Model::RDFTrine::BasicGraphPattern::graph().</li>
<li>Added the ability to add label annotations to RDF::Query::VariableBindings, RDF::Query::Algebra::Triple and RDF::Query::Algebra::Quad objects.</li>
<li>RDF::Query::Plan::Quad and RDF::Query::Plan::Triple now add an 'origin' label annotation to the RDF::Query::VariableBindings object if the underlying statement has one.</li>
<li>RDF::Query::Plan::prune_plans now uses a stable sort when comparing plan costs.</li>
<li>RDF::Query::Algebra::Triple::new now up-casts to RDF::Query node objects, if necessary.</li>
<li>RDF::Query::Model::RDFTrine::generate_plans now respects the force_no_optimization query flag.</li>
<li>RDF::Query::Algebra::BasicGraphPattern::sse() now sorts triples for output.</li>
<li>Added distinguish_bnode_variables method to RDF::Query::Algebra::Quad and RDF::Query::Algebra::Triple.</li>
<li>Added RDF::Query::Node::Blank::make_distinguished_variable method.</li>
<li>Added caching of sparql serializations to RDF::Query::Algebra::BasicGraphPattern and RDF::Query::Algebra::Triple.</li>
<li>Added code to RDF::Query::VariableBindings::new to up-cast any RDF::Trine::Node objects to their RDF::Query equivalents.</li>
<li>RDF::Query::new() now looks for $args{ defines }, and adds them to the internal %options HASH.</li>
<li>Added hook in RDF::Query::execute_plan() to print the query plan to STDERR if $options{plan} is set (can be set if defines).</li>
<li>Updated RDF::Query::Plan to only consider model-specific plans (if there are any).</li>
</ul>
</li>
</ul>
<h3 id="v2_100">Version 2.100 (2009-03-18)</h3>
<ul>
<li>API
<ul>
<li>Added ::Algebra::BasicGraphPattern::connected method.</li>
<li>Added 'node_counts' as a recognized key to ::Model::RDFTrine::suports().</li>
<li>Added ::Model::node_count method.</li>
<li>Added ::Model::RDFTrine::count_statements() and ::Model::RDFTrine::node_count() methods.</li>
<li>Added 'store' field to the data returned by the meta() method in the ::Model::* classes.</li>
<li>Added a peek method to ::Iterator to support execution deferment like in ::Algebra::Service.</li>
<li>Added ability to force SERVICE calls to abort using $ENV{RDFQUERY_THROW_ON_SERVICE} and RequestedInterruptError.</li>
<li>Added bf methods to ::Triple and ::BasicGraphPattern to describe the BGP in terms of bound/free.</li>
<li>Added bind_variables method to RDF::Query::Algebra.</li>
<li>Added caching to ::Algebra::Service::_names_for_node.</li>
<li>Added code to count (and warn) the rate of false positives from a bloomjoin.</li>
<li>Added cost model hooks in RDF::Query and ::Algebra::BasicGraphPattern.</li>
<li>Added FeDeRate BINDINGS to the list of supported extensions.</li>
<li>Added get_basic_graph_pattern to ::Model::RDFTrine (not used yet).</li>
<li>Added is_solution_modifier() methods to ::Algebra classes.</li>
<li>Added labels and common patterns to service description template.</li>
<li>Added more logic and debugging to aggregating triples into BGPs for SERVICE calls.</li>
<li>Added optional restriction argument to ::Algebra::subpatterns_of_type.</li>
<li>Added RDF::Query::Model::RDFTrine::BasicGraphPattner::graph() method.</li>
<li>Added RDF::Query::Node::compare for sorting (either Trine or Query) node objects.</li>
<li>Added RDF::Query::plan_class so that ::Federate can overload calls to ::Plan methods.</li>
<li>Added support for computed statement generators (like ARQ's computed property support [e.g. list:member]).</li>
<li>Added trial subsumes() methods to ::Algebra::BasicGraphPattern and ::Algebra::Triple.</li>
<li>Algebra classes now call RDF::Query::algebra_fixup for optimization before falling back on normal fixup code.</li>
<li>Allow equality test and disjunction filters in patterns that can be compiled to SQL.</li>
<li>Fixed ::Algebra::GroupGraphPattern to use join_bnode_streams in cases where the bloom filter wasn't automatically created but instead provided by the user.</li>
<li>Fixed ::Model::RDFTrine::as_string use with Quads.</li>
<li>Fixed argument list for RDF::Query::Algebra::Service::_names_for_node called from bloom function.</li>
<li>Fixed bug so ::Model::RDFTrine::meta may be called as a class method.</li>
<li>Fixed RDF::Query::algebra_fixup to ignore service capabilities that would result in empty BGPs.</li>
<li>Modified code for aggregate queries (though they are currently broken).</li>
<li>Moved construction of bloom-filter-optimized patterns to RDF::Query::Algebra::GroupGraphPattern::_bloom_optimized_pattern().</li>
<li>Moved initial federated service code into RDF::Query::fixup and ::algebra_fixup.</li>
<li>Moved QEP generation code to RDF::Query::query_plan so it can be overloaded.</li>
<li>Moved RDF::Query::add_service() to RDF::Query::Federate::add_service().</li>
<li>Parsing service descriptions now more forgiving in the face of missing values.</li>
<li>RDF::Query::Algebra::Triple::new now adds RDF::Query::Node::Variable objects for undefined nodes.</li>
<li>RDF::Query::fixup() now only returns a construct pattern (the query pattern now being returned by RDF::Query::query_plan()).</li>
<li>RDF::Query::Model::get_computed_statements now doesn't die if there's no query object present.</li>
<li>RDF::Query::new() now accepts two-argument form with just $query and \%options.</li>
<li>RDF::Query::Node::Literal objects now can compare as equal when they're of numeric type but the lexical values aren't numeric.</li>
<li>RDF::Query::prune_plans now takes ExecutionContext as an argument, and in turn calls ::Plan::prune_plans.</li>
<li>RDF::Query::query_plan() now returns all possible query plans when called in list context.</li>
<li>RDF::Query::query_plans now calls RDF::Query::prune_plans to select from the list of possible QEPs.</li>
<li>RDF::Trine::Node::Resource now escapes unicode in base URIs (now just relative URI part) before calling URI->new_abs.</li>
<li>Removed now unused RDF::Query::construct() and RDF::Query::fixup().</li>
<li>Removed old execute() code from ::Algebra classes.</li>
<li>Removed unused redland fallback code from RDF::Query::Model::RDFTrine.</li>
<li>Split RDF::Query::execute into prepare() and execute_plan() methods.</li>
<li>Converted RDF::Query::execute() to use ::Plan classes.</li>
<li>Updated ::Compiler::SQL to recognize ::Algebra::Project objects.</li>
<li>Updates to RDF::Query::execute() to support explicit pre-binding lists (instead of just scalar values).</li>
<li>::Algebra::GroupGraphPattern now throws an exception if passed unblessed values as patterns.</li>
<li>::Federate now labels nodes in the QEP tree with applicable services.</li>
<li>::Model::debug() now shows data from the named graph model.</li>
<li>::Model::RDFTrine::add_uri now decodes resulting content as utf8 before proceeding.</li>
<li>::Model::RDFTrine::meta() probes the underlying store object to declare the proper 'store' class.</li>
<li>::Service::_names_for_node updated to use ::Plan classes for query execution (fixes use of the k:bloom filter).</li>
</ul>
</li>
<li>Classes
<ul>
<li>Added algebra classes for solution modifiers and query forms (construct, project).</li>
<li>Added code and tests for Query Execution Plan classes RDF::Query::Plan::*.</li>
<li>Added RDF::Query::Federate::Plan for federation-specific code.</li>
<li>Added RDF::Query::BGPOptimizer implementing a basic optimizer for basic selectivity-based join ordering.</li>
<li>Added RDF::Query::CostModel classes for computing/estimating the cost of executing a specific pattern.</li>
<li>Added RDF::Query::ExecutionContext to hold all necessary information for query execution (query, model, bound variables).</li>
<li>Added RDF::Query::ServiceDescription for parsing DARQ-style service descriptions.</li>
<li>Added RDF::Query::VariableBindings to wrap existing HASH-based variable binding structure.</li>
<li>Added stub ::Plan::ThresholdUnion class for running optimistic queries.</li>
<li>Added workaround to RDFCore bridge so that RDF::Core doesn't die if getStmts is called with a Literal in the subj or pred position.</li>
<li>Added a RequestedInterruptError exception class.</li>
<li>Added code for RDF-Trine specific BGP query plans.</li>
<li>Changed debugging in RDF::Query modules to use Log::Log4perl.</li>
<li>Made SERVICE work again by rolling back streaming socket work (now commented out).</li>
<li>Moved federation code to new RDF::Query::Federate class.</li>
<li>Plan generation now includes any plans the model object can provide.</li>
<li>RDF::Query now always uses a cost model (defaulting to ::Naive).</li>
<li>RDF::Query::Federate now defaults to SPARQLP parser.</li>
<li>Removed logging/warn calls from forked process in ::Service (was screwing up the parent-child IO pipe).</li>
<li>Removed use of "DISTINCT" queries in SERVICE calls (for pipelining).</li>
<li>ServiceDescription now only runs sofilter if ?subject/?object are bound.</li>
<li>Started work on a more holistic approach to supporting service descriptions (instead of using add_computed_statement_generator()).</li>
<li>Updated ::Algebra::Service to fork and use LWP's callback mechanism for concurrency.</li>
<li>::Algebra::Service now defers loading of content until the first result is requested.</li>
<li>::Model::RDFTrine now only produces BGP plans if there is no get_computed_statement_generators in the query object.</li>
<li>Code now materializes all node identities before creating the Bloom filter (so capacity arg is accurate).</li>
<li>Bloom filter use is now only attempted on SERVICE blocks that don't immediately contain a FILTER.</li>
<li>Re-ordered conditionals so that the service-bloom-filter try block is called less frequently.</li>
<li>SERVICE execution now uses non-identity reasoning Bloom filter function.</li>
</ul>
</li>
<li>Syntax and Serialization
<ul>
<li>Added from_sse method to ::Statement, ::Node.</li>
<li>Added initial code for ARQ-style property paths.</li>
<li>Added initial parser code for SPARQL Update (SPARUL) extension.</li>
<li>Added new 'UNSAID' syntax for SPARQLP, implementing negation.</li>
<li>Added parse_expr method to RDF::Query::Parser::SPARQL.</li>
<li>Added RDF::Query::Algebra::Quad::bf() method.</li>
<li>Fixed RDQL parser to qualify URIs before returning from parse().</li>
<li>Fixed SSE serialization of Aggregates using '*' instead of a variable as the column.</li>
<li>Removed (now unused) parser generator script.</li>
<li>SPARQL parser now always adds a ::Algebra::Project (even when the query selects '*').</li>
<li>SPARQL parser now creates ::Algebra::Construct objects for CONSTRUCT queries.</li>
<li>SPARQL parser now puts ::Distinct above ::Sort algebras in the parse tree.</li>
<li>SPARQLP parser now creates ::Project object as parent of any ::Aggregate.</li>
<li>Turtle parser now doesn't modify the lexical value of numeric typed literals.</li>
<li>Turtle parser now makes universal IDs for all blank node (even those with given IDs like _:xyz).</li>
<li>Updated ::Algebra SSE serializations to conform to Jena's serialization syntax.</li>
<li>Updated ::Algebra::Limit::sse to emit 'slice' serialization if its child is a ::Algebra::Offset.</li>
<li>Updated as_sparql() methods to support the new ::Construct classes.</li>
<li>Updated RDF::Query::sse to emit base and prefix serializations.</li>
<li>Updated SPARQL parser and serializer tests to always assume an ::Algebra::Project on SELECT queries.</li>
<li>Updated SSE serialization of ::Join::PushDownNestedLoop to use 'bind-join' terminology.</li>
<li>Updates to SPARQLP parser to support FeDeRate BINDINGS keyword.</li>
<li>::Algebra::Distinct now does proper serialization in as_sparql().</li>
<li>::GroupGraphPattern::sse() updated to output the '(join ...)' only if the GGP has more than one pattern.</li>
</ul>
</li>
<li>Optimizer
<ul>
<li>Added benchmark/plans.pl to show the runtimes of the available QEPs for a query.</li>
<li>Added benchmark/costmodel.pl for testing the RDF::Query::CostModel.</li>
<li>Added logging for execution time (time to construct iterator) of Triples, BGPs, GGPs and sorting.</li>
<li>Added logging of cardinalities in ::Algebra::Triple, ::Algebra::BasicGraphPattern and ::Algebra::Service.</li>
<li>Added logging to plan classes ::NestedLoop, ::Service, ::Triple.</li>
<li>Naive plan is used in ::Federate::Plan::generate_plans only if no optimistic plans are available.</li>
<li>Updated cost model code to work with ::Plan classes instead of ::Algebra classes.</li>
<li>Logging code now uses sse serialization as log keys (because of expressions that can't be serialized as SPARQL).</li>
<li>Logging object can now be passed to RDF::Query constructor.</li>
<li>Updated logging of algebra execution to use SPARQL serialization as logging key.</li>
</ul>
</li>
<li>Miscellaneous
<ul>
<li>SPARQL parser now constructs ::Algebra::Project objects (had been in RDF::Query::execute).</li>
<li>Updated RDF::Query to require version 0.108 of RDF::Trine.</li>
<li>Added new bloom:filter function variant that doesn't use identity reasoning.</li>
<li>Added debugging information when RDFQUERY_THROW_ON_SERVICE is in effect.</li>
<li>Fixed test plan for t/optimizer.t in cases where no appropriate model is available.</li>
<li>Updated plan generation code to use ::BGPOptimizer when the model supports node_counts.</li>
<li>Fixed SSE serialization bug in ::Algebra::Sort.</li>
<li>Fixed bugs in RDF::Query and RDF::Query::Expression classes that insisted variables be RDF::Query objects (and not simply RDF::Trine objects).</li>
<li>Fixed propogation of iterator binding_names when pre-bound values are used in ::Algebra execution.</li>
<li>Fixed RDF::Query::Algebra::Triple to correctly set binding_names when pre-binding is used.</li>
<li>Fixed use of pre-binding in execution of RDF::Trine optimized BasicGraphPatterns.</li>
<li>Fixed bug in SQL compilation when restricting left-joins to specific node types (based on functions like isIRI).</li>
<li>Fixed node identity computation based on owl:sameAs.</li>
<li>Fixed bitrotted livejournal example script to work with new 2.000 API.</li>
</ul>
</li>
<li>Tests
<ul>
<li>Added expected result count test in t/34-servicedescription.t.</li>
<li>Added initial tests for algebra subsumes method.</li>
<li>Added logging and costmodel tests.</li>
<li>Added more example capabilities and patterns to the test service descriptions.</li>
<li>Added RDF::Trine::Store::Hexastore to test model construction list in t/models.pl.</li>
<li>Added sparql:pattern data to test service descriptions.</li>
<li>Added sse re-serialization test to t/29-serialize.t.</li>
<li>Added support for sparql:pattern in service description parsing.</li>
<li>Added t/plan-rdftrine.t to test QEP generation optimized for RDF::Trine BGPs.</li>
<li>Added test data for repeat patterns (e.g. { ?a ?a ?b}).</li>
<li>Added tests to t/plan.t for QEP sse serialization.</li>
<li>Cleaned up federation tests.</li>
<li>Commented out in-progress service description tests.</li>
<li>Fixed bug in t/23-model_bridge.t to allow two models from the same model class to be used in testing.</li>
<li>Fixed error handling in t/plan.t.</li>
<li>Fixed t/costmodel-naive.t to provide a serialized query to ::Plan::Service constructor.</li>
<li>Fixed test count in algebra-bgp.t.</li>
<li>Fixed test in t/31-service.t that relied on identity-reasoning support in bloom filters (which is now off by default).</li>
<li>Fixed use of RDFQUERY_NETWORK_TESTS in 31-service.t.</li>
<li>Improved use of temporary RDF::Trine stores in RDF::Query tests.</li>
<li>Marked tests TODO for federated query serialization.</li>
<li>Removed what looks like an accidentally pasted test in t/plan.t.</li>
<li>SERVICE tests involving bloom filter handling marked as TODO.</li>
<li>ServiceDescription parsing now gets entire sparql:patterns and not just arcs to depth one.</li>
<li>Silenced unfinished test debugging in t/logging.t.</li>
<li>Updated args to roqet call in failing_earl_tests.sh.</li>
<li>Updated costmodel and logging test expected results that changed due to changes to ::Plan::Join code.</li>
<li>Updated dawg-eval.t regex to recognize RDFTrine blank nodes.</li>
<li>Updated DBPedia test query in t/34-servicedescription.t to reflect new source data.</li>
<li>Updated expected cardinalities in t/logging.t for current plan choice.</li>
<li>Updated logging tests to use the new sparql serialization keys.</li>
<li>Updated SERVICE test in t/plan.t (still broken, but only runs when dev env var RDFQUERY_NETWORK_TESTS in effect).</li>
<li>Updated t/plan.t to be less dependent on the specific state of the kasei.us service endpoint.</li>
<li>Updated test service description RDF for new tests.</li>
<li>Updates to improve logging and test coverage.</li>
</ul>
</li>
<li>Examples and Documentation
<ul>
<li>Added examples/query.pl to show a simple example of loading data and executing a query.</li>
<li>Added examples/create_query_api.pl for generating queries programatically (based on request from KjetilK).</li>
<li>Added bin/graph-bgp.pl to produce a png of a query's BGP variable connectivity graph.</li>
<li>Added bin/graph-query.pl to graph the (one chosen) QEP tree.</li>
<li>Added bin/graph-qeps.pl to vizualize all QEPs of a query with GraphViz.</li>
<li>Updated bin/parse.pl to emit the SSE serialization of the query algebra tree.</li>
<li>Updated bin/rdf_parse_turtle.pl to warn on any parser error.</li>
</ul>
</li>
</ul>
<h3 id="v2_002">Version 2.002 (2008-04-25)</h3>
<ul>
<li>Updated Bloom::Filter required version in RDF-Query's Makefile.PL.</li>
<li>Fixed bug in get_function() when called as a class method.</li>
<li>Updated sparql:logical-* functions to accept more than two operands.</li>
<li>Added code to make loading of Bloom::Filter optional.</li>
<li>Added Bloom::Filter to list of recommended modules.</li>
</ul>
<h3 id="v2_001">Version 2.001 (2008-04-19)</h3>
<ul>
<li>Fixed use of "DESCRIBE <resource>" (instead of "DESCRIBE ?var").</li>
<li>Fixed SPARQL serialization of queries with DISTINCT.</li>
<li>Added ::Algebra::subpatterns_of_type method for retrieving all subpatterns of a particular type.</li>
<li>Moved sort_rows() into new ::Algebra classes Sort, Limit, Offset and Distinct.</li>
<li>Updated SQL compiler to handle new ::Algebra classes.</li>
<li>Bumped required RDF::Trine version to 0.106.</li>
<li>Added methods to RDF::Query for retrieving lists of supported SPARQL extensions and extension functions.</li>
<li>RDF::Trine pattern optimization now holds onto the original BGP object for forwarding of calls to as_sparql().</li>
<li>Removed use of Storable module. Query execution no longer clones parse tree before running.</li>
<li>Simplified project operation on query stream in RDF::Query::execute().</li>
<li>fixup() method in ::Algebra and ::Expression now passed the query object as an argument.</li>
<li>Replaced ::RDFTrine::unify_bgp with more general fixup() implementation.</li>
<li>::Algebra classes now defer to the bridge during fixup() to allow model-specific optimizations.</li>
<li>RDF::Trine::Iterator::smap now allows overriding default construct_args (e.g. binding names).</li>
<li>sparql:str now throws a TypeError if argument isn't bound.</li>
<li>Fixed referenced_variables in RDF::Query::Expression.</li>
<li>Fixed COUNT function to only count bound variables.</li>
<li>Fixed aggregation to work with expressions.</li>
<li>Added support for GROUP BY clauses to aggregation queries.</li>
<li>Removed now unused ::Algebra::OldFilter class.</li>
<li>Added serialization tests for aggregate and union patterns.</li>
<li>Moved as_sparql methods from RDF::Trine:: to RDF::Query:: classes.</li>
<li>Removed context- (quad-) specific code from RDF::Query::Algebra::Triple.</li>
<li>Fixed serialization of BOUND filter functions.</li>
<li>Fixed serialization of unary expressions.</li>
<li>Fixed call to join_streams to use ::Iterator::Bindings instead of ::Iterator.</li>
<li>var_or_expr_value now takes bridge object as an argument.</li>
<li>var_or_expr_value will now accept any RDF::Query::Expression object as an argument.</li>
<li>Added test for using AS syntax for variable renaming: "(?var AS ?newvar)".</li>
<li>Added support for MIN, MAX, COUNT and COUNT-DISTINCT aggregate operators to the SPARQLP parser.</li>
<li>Added COUNT DISTINCT variant aggregate operator.</li>
<li>Aggregates (MIN, MAX, COUNT, COUNT-DISTINCT) now return xsd:decimal values (this shouldn't really happen for non-numeric operands to MIN and MAX...)</li>
<li>Added as_sparql submethod to RDF::Query::Node::Literal to serialize numeric types unquoted.</li>
<li>Added var_or_expr_value method in RDF::Query.</li>
<li>Removed unused _true and _false methods in RDF::Query.</li>
<li>Fixed existing aggregates code and tests.</li>
<li>Removed unused (and bitrotted) t/05-stress.t test.</li>
<li>Made all tests that access the network opt-in with the RDFQUERY_NETWORK_TESTS environment variable.</li>
<li>Updated POD for ::Expression::Alias.</li>
<li>Added tests for select expressions.</li>
<li>Added initial support for selecting expression values.</li>
</ul>
<h3 id="v2_000">Version 2.000 (2008-03-19)</h3>
<ul>
<li>RDF::Query now uses RDF::Trine package for common classes (nodes, statements, iterators).</li>
<li>Moved RDF::Query::Stream into RDF::Trine::Iterator namespace.</li>
<li>Reshuffled SPARQL parsers tests.</li>
<li>Added support for RDF::Trine::Model.</li>
<li>RDF::Trine::Iterator can serialize to XML and JSON natively; Updated tests accordingly.</li>
<li>rdf namespace is only added by default for RDQL.</li>
<li>Fixed bug where the wrong bridge object would be returned for queries with FROM clauses.</li>
<li>Moved query_more code to Algebra classes.</li>
<li>Added RDF::Query::pattern method to return the GGP algebra pattern for the query.</li>
<li>Added RDF::Query::as_sparql method to serialize query as SPARQL string.</li>
<li>Removed unused RDF::Query::set_named_graph_query method.</li>
<li>Fixed bug where triples from a FROM clause were loaded into the underlying persistent store.</li>
<li>Added POD to RDF::Query::Node classes.</li>
<li>Added equal method to RDF::Query::Node classes.</li>
<li>RDF::Query::Node::Blank constructor now optionally produces identifiers.</li>
<li>Merged tSPARQL parsing code into new SPARQLP parser.</li>
<li>Added definite_variables method to RDF::Query::Algebra classes.</li>
<li>Triple class now serializes rdf:type shortcut 'a' appropriately.</li>
<li>Removed 'VAR' type from ::Node::Variable object structure.</li>
<li>Updated code to always expect a HASH reference from ::Bindings iterator.</li>
<li>Added more (sparql and see) serialization tests.</li>
<li>Removed old fixup code, replaced by ::Algebra fixup methods.</li>
<li>Moved FROM clause data loading to its own method.</li>
<li>Started removing old code (RDF::Base, direct DBI use, AUTOLOAD, profiling).</li>
<li>Moved general count_statements() method into bridge superclass.</li>
<li>Fixed SQL compiler to work with ::Algebra and ::Node classes.</li>
<li>Added as_native method to bridge superclass for converting ::Node objects to bridge-native objects.</li>
<li>Updated document namespace declaration for SPARQL XML Results.</li>
<li>Added support for SERVICE queries (ala ARQ) with Bloom filter semijoins.</li>
<li>Moved Expression classes out of the Algebra hierarchy and into their own space (RDF::Query::Expression).</li>
</ul>
<h3 id="v1_501">Version 1.501 (2007-11-15)</h3>
<ul>
<li>Fixed CONSTRUCT+OPTIONAL bug.</li>
<li>Added as_sparql methods to Algebra and Node classes to serialize patterns in SPARQL syntax.</li>
<li>Added deparse script.</li>
<li>Fixed jena:sha1sum tests when Digest::SHA1 isn't available.</li>
</ul>
<h3 id="v1_50">Version 1.500 (2007-11-13)</h3>
<ul>
<li>Query Engine
<ul>
<li>URIs are now properly qualified with a BASE when present.</li>
<li>Base URI passed to constructor is now used if no BASE clause exists in the query.</li>
<li>Fixed BASE qualification when an IRI contains Unicode characters (Emulating IRI support with the URI module).</li>
<li>NAMED graph data is now seperated from the default model into new (temporary) models.</li>
<li>NAMED graphs now work with RDF::Core.</li>
<li>Added new RDF::Query::Algebra:: classes that are used to represent query ASTs.</li>
<li>Added new RDF::Query::Node:: classes that are used to represent RDF Nodes and Variables.</li>
<li>Major refactoring to RDF::Query::query_more() to enhance extensibility.</li>
<li>Added RDF::Query::query_more_triple() and RDF::Query::query_more_bgp() for triple and bgp matching.</li>
<li>Improved support of GGP pattern matching.</li>
<li>Added sgrep, smap, swatch and concat methods to RDF::Query::Stream class.</li>
<li>Refactored query_more() variants and sort_rows() to use new stream methods sgrep, smap, and concat.</li>
<li>Continued to fix bugs to more closely align with DAWG tests.</li>
<li>Updated DAWG tests to run with the RDF::Core backend.</li>
<li>Any DAWG tests with mf:requires are now automatically marked TODO.</li>
<li>DAWG tests graph equality is now punted to user verification.</li>
<li>Fixed bNode merging code in DAWG tests.</li>
<li>query_more() variants and sort_rows() now all return RDF::Query::Stream objects.</li>
<li>query_more() (and everything it calls) now expects bridge object as a method argument (to ensure NAMED graph querying works).</li>
<li>Added join_streams() to perform netsted-loop natural joins on two Stream objects.</li>
</ul></li>
<li>Filters
<ul>
<li>Added call_function() method to abstract the generation of ['FUNCTION',...] blocks.</li>
<li>FILTER operator != is now negative for unknown datatypes.</li>
<li>Fixed exception handling in check_constraints().</li>
<li>Fixed type-promotion in arithmetic operations and added recognized xsd numeric types.</li>
<li>API Chnage: extension functions now take a bridge object as their second argument (after the query object).</li>
<li>Fixed equals() method in RDF::Core bridge to properly use the RDF::Core API.</li>
<li>Javascript function makeTerm now accepts language and datatype parameters.</li>
<li>toString() javascript funtion now returns just the literal value (not including language or datatype).</li>
<li>sop:str now will stringify blank nodes properly.</li>
<li>sparql:langmatches now properly differentiates between no language tag and an empty language tag.</li>
</ul></li>
<li>Parsers
<ul>
<li>Parsers now generate ASTs using the Algebra and Node classes.</li>
<li>Fixed bugs in SPARQL tokenizer for some Unicode strings (with combining accents).</li>
<li>RDF::Query::Parser::new_literal() now canonicalizes language tags (to lowercase).</li>
<li>Fixed GGP verification in RDF::Query::Parser::SPARQL::fixup().</li>
<li>Merged GGPAtom changes from tSPARQL to SPARQL grammar.</li>
</ul></li>
<li>Backends
<ul>
<li>Fixed bug in RDF::Query::Model::RDFCore::equals() when comparing two blank nodes.</li>
<li>Changed RDF::Query::Model::RDFCore::as_string to return strings where node type is identifiable (like Redland, URIs as [...], literal \"...\", bnodes (...)).</li>
<li>Model methods literal_value, literal_datatype and literal_value_langauge now return undef if argument isn't a literal.</li>
<li>Model methods uri_value and blank_identifier now return undef unless argument is of correct type.</li>
<li>Model add_string methods now normalize Unicode input.</li>
<li>Blank node prefix is now scoped to bridge, not lexically in RDF::Query::Model::RDFCore.</li>
<li>RDF::Query::Model::Redland::new_literal now forces argument to a string (XS code breaks on non-PVOK scalars).</li>
<li>RDF::Query::Model::Redland::add_uri now uses LWP instead of relying on Redland to fetch content.</li>
<li>Redland model class now recognizes DateTime objects as literals.</li>
<li>Updated add_uri() method in RDF::Core bridge to support named graphs (only one name per model for now).</li>
</ul></li>
<li>Miscellaneous
<ul>
<li>Added rudimentary profiling code (Devel::DProf seems to crash on RDF::Query)</li>
<li>Added initial code for supporting property functions (using time:inside as an example).</li>
<li>Removed multi_get code.</li>
<li>Removed code for MULTI patterns. Will replace with algebra-based optimization in the future.</li>
<li>RDF::Query::Stream constructor now accepts an ARRAY reference.</li>
<li>Stopped using the peephole optimizers. Will replace with an algebra-based optimizer in the future.</li>
</ul></li>
</ul>
<h3 id="v1_044">Version 1.044 (2007-09-13)</h3>
<ul>
<li>DAWG tests now emit EARL reports.</li>
<li>Added test harness and temporal data importing scripts to new bin/ directory.</li>
<li>Added support for temporal queries in RDF::Query and optimizers.</li>
<li>Added support for CONSTRUCT queries in new YAPP-based SPARQL parsers.</li>
<li>Added TIMED graph tests for new SPARQL temporal extensions.</li>
<li>Added tests to SPARQL parser for bugs that were discovered with temporal extensions.</li>
<li>Added POD to new SPARQL parsers.</li>
<li>Added new Parse::Yapp-based SPARQL parser in preparation for temporal SPARQL extensions.</li>
<li>Added stub functions for temporal extension support.</li>
<li>Added model_as_stream() method to Redland bridge class.</li>
<li>Addded debug() method to RDF::Query::Model.</li>
<li>Added UNION tests.</li>
<li>Added a javascript debugging flag to RDF::Query.</li>
<li>Added RDF::Query::groupgraphpattern() for handling GGPs.</li>
<li>Added xsd:integer casting function.</li>
<li>Added <http://kasei.us/2007/09/functions/warn> as a FILTER tee that warns to STDERR.</li>
<li>Added Eyapp SPARQL grammer file and replaced parser with auto-generated code from eyapp.</li>
<li>Marked some SPARQL parser tests as TODO (due to incompatability with new YAPP-based parser).</li>
<li>Network tests are now run against all available models.</li>
<li>Stream tests are now run against all available models.</li>
<li>Query parser initialization code cleaned up (and now supports beta tSPARQL parser).</li>
<li>net_filter_function() now properly accesses nodes with bridge methods.</li>
<li>RDF::Query::Parser::new_blank now assigns default names if none is supplied.</li>
<li>Updated error messages in SPARQL parser to align with new YAPP-based parser.</li>
<li>SPARQL parse_predicate_object() fixed to support tripleNodes.</li>
<li>SPARQL parse_object() and parse_predicate() fixed for whitespace insensitivity.</li>
<li>Moved old hand-written SPARQL parser to now unused SPARQL-RD.pm.</li>
<li>Moved new YAPP-based SPARQL parser to SPARQL.pm.</li>
<li>Copied YAPP-based SPARQL parser for new temporal extension tSPARQL.pm.</li>
<li>Moved existing tests for hand-written SPARQL parser to 01-sparql_parser.t.rd-old.</li>
<li>Moved new YAPP-based SPARQL tests to t/01-sparql_parser.t.</li>
<li>Removed bad-syntax queries from optimizer and SQL compiler tests.</li>
<li>Fixed bad-syntax queries in stream and hook tests.</li>
<li>Made output of coverage tests easier to read by adding test names.</li>
<li>Fixed SPARQL parsers to allow keywords as variable names.</li>
<li>Fixed SPARQL parsers to allow dashes and underscores in variable names.</li>
<li>Fixed bad parser constructor call in SQL compiler tests.</li>
<li>Suppressed RDF::Base loading (again) during RDF::Query startup.</li>
<li>RDF::Query::Model::Redland::debug now shows contexts during iterator debugging.</li>
<li>Moved the old (hand written) SPARQL parser out of the way to make test harnesses happy.</li>
<li>SPARQL parser now respects spec regarding the reuse of blank node labels across BGPs.</li>
<li>SPARQL parser now does the right thing with NIL (the empty list).</li>
<li>SPARQL parser now handles embedded GGPs correctly.</li>
<li>Updated SPARQL parser and tests to pass (almost all) DAWG tests.</li>
<li>Fixed bug where results couldn't be sorted by a non-selected variable.</li>
<li>Removed the unused RDF::Query::timed_graph() method.</li>
<li>RDF::Query::qualify_uri is now more liberal in what it accepts.</li>
<li>Fixed xsd:boolean casting of integer values.</li>
<li>RDF::Query::Parser::new_variable can now generate private variable names.</li>
<li>Fixed test suite to work properly on systems without Redland.</li>
<li>Disabled loading of tSPARQL parser for release.</li>
<li>Removed function prototype definitions in Model base class (was causing loading problems when models are missing).</li>
</ul>
<h3 id="v1_043">Version 1.043 (2007-06-14)</h3>
<ul>
<li>Fixed broken MANIFEST causing MakeMaker code to break.</li>
</ul>
<h3 id="v1_042">Version 1.042 (2007-06-13)</h3>
<ul>
<li>Added support for Javascript URL-based extension functions.</li>
<li>Added GPG signing support for Javascript functions.</li>
<li>Added meta methods to model classes.</li>
<li>Added count_statements methods to model classes.</li>
<li>Added default format for stringifying query result streams.</li>
<li>Added SPARQL syntax coverage tests.</li>
<li>Added stream tests.</li>
<li>ISIRI() now returns a sop:isIRI function IRI.</li>
<li>Redland bridge add_uri strips off URI fragment from parser base URI.</li>
<li>Underlying models aren't loaded if turned off by environment variables.</li>
<li>Stopped using the (currently broken) multi-get code.</li>
<li>Model classes aren't used if turned off by environment variable.</li>
<li>Standardized node testing to is_node (replacing older isa_node).</li>
<li>GPG verification failure now throws exceptions.</li>
<li>GPG fingerprint handling is now whitespace insensitive.</li>
<li>Removed (currently) unused multiget tests.</li>
<li>Redland bridge uri_value returns undef if not called with a node.</li>
</ul>
<h3 id="v1_041">Version 1.041 (2006-11-26)</h3>
<ul>
<li>Removed unwanted '+' signs on stringified bigints when running under perl 5.6.x.</li>
<li>Fixed unicode errors when running under perl 5.6.x.</li>
<li>Added tests for model bridge classes.</li>
<li>Fixed bugs in SQL bridge class.</li>
<li>RDFCore and Redland bridge classes now throw error when passed a bad model object.</li>
<li>Bridge class support() method now responds to feature requests for 'temp_model'.</li>
<li>Fixed bug in RDF::Query::Model::RDFCore::isa_resource returning true for blank nodes.</li>
<li>Fixed code in RDF::Query::Model::::SQL::equals().</li>
<li>Added partial support for new RDF::Storage::DBI storage class.</li>
<li>Added support for RDF::Query:::Model::SQL models in RDF::Query bridge code.</li>
<li>Removed RDF::Query::Model::SQL::* code that's now in RDF::Storage::DBI.</li>
<li>Added tests for backend bridge classes (RDF::Query::Model::*).</li>
<li>Added checks for which backends support XML serialization.</li>
<li>Fixed naive peephole tests in cases where model supports cost-based analysis.</li>
<li>Fixed bugs in tests that were relying on as_string() to act like literal_value().</li>
<li>Added RDF::Base support.</li>
<li>Fixed bug in fixup() that prevented running queries against multiple models.</li>
<li>Added SimpleQueryPatternError exception class for future work on multi-get optimizations.</li>
<li>Removed forced dependence on Digest::SHA1.</li>
<li>Makefile.PL now recommends Digest::SHA1 (for jena function) and Geo::Distance (for 07-filters.t).</li>
</ul>
<h3 id="v1_040">Version 1.040 (2006-07-21)</h3>
<ul>
<li>Added support for BOUND() fiters in SQL compilation.</li>
<li>SQL compiler now produces valid SQL when query variable names are SQL reserved keywords.</li>
<li>Moved SPARQL parser test data into YAML.</li>
<li>Added YAML as a build-time prerequisite.</li>
<li>Fixed SPARQL parsing bug for blank nodes as statement objects.</li>
<li>Added peephole optimizer code with naive and cost-analysis strategies.</li>
<li>Added add_string method to RDF::Query::Model::Redland.</li>
<li>Added node_count method to RDF::Query::Model::Redland (only used for testing at this point).</li>
<li>RDF::Query::execute() now uses the peephole optimizer.</li>
<li>Removed punting code in RDF::Query::execute that tried to do JIT optimization.</li>
<li>Removed calls to getLabel() on model objects in test files.</li>