sparql 3.1.0 → 3.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +188 -73
  3. data/UNLICENSE +1 -1
  4. data/VERSION +1 -1
  5. data/bin/sparql +37 -17
  6. data/lib/rack/sparql/conneg.rb +2 -2
  7. data/lib/sinatra/sparql.rb +4 -4
  8. data/lib/sparql.rb +13 -12
  9. data/lib/sparql/algebra.rb +11 -19
  10. data/lib/sparql/algebra/aggregate.rb +2 -2
  11. data/lib/sparql/algebra/expression.rb +67 -38
  12. data/lib/sparql/algebra/extensions.rb +182 -23
  13. data/lib/sparql/algebra/operator.rb +55 -22
  14. data/lib/sparql/algebra/operator/abs.rb +2 -2
  15. data/lib/sparql/algebra/operator/add.rb +2 -2
  16. data/lib/sparql/algebra/operator/alt.rb +2 -2
  17. data/lib/sparql/algebra/operator/and.rb +3 -3
  18. data/lib/sparql/algebra/operator/asc.rb +1 -1
  19. data/lib/sparql/algebra/operator/ask.rb +2 -12
  20. data/lib/sparql/algebra/operator/avg.rb +8 -1
  21. data/lib/sparql/algebra/operator/base.rb +8 -8
  22. data/lib/sparql/algebra/operator/bgp.rb +2 -2
  23. data/lib/sparql/algebra/operator/bnode.rb +2 -2
  24. data/lib/sparql/algebra/operator/bound.rb +1 -1
  25. data/lib/sparql/algebra/operator/ceil.rb +2 -2
  26. data/lib/sparql/algebra/operator/clear.rb +2 -2
  27. data/lib/sparql/algebra/operator/coalesce.rb +1 -11
  28. data/lib/sparql/algebra/operator/compare.rb +15 -8
  29. data/lib/sparql/algebra/operator/concat.rb +2 -2
  30. data/lib/sparql/algebra/operator/construct.rb +4 -13
  31. data/lib/sparql/algebra/operator/contains.rb +2 -2
  32. data/lib/sparql/algebra/operator/copy.rb +2 -2
  33. data/lib/sparql/algebra/operator/count.rb +1 -1
  34. data/lib/sparql/algebra/operator/create.rb +2 -2
  35. data/lib/sparql/algebra/operator/dataset.rb +3 -14
  36. data/lib/sparql/algebra/operator/datatype.rb +1 -1
  37. data/lib/sparql/algebra/operator/day.rb +1 -1
  38. data/lib/sparql/algebra/operator/delete.rb +6 -6
  39. data/lib/sparql/algebra/operator/delete_data.rb +2 -2
  40. data/lib/sparql/algebra/operator/delete_where.rb +3 -3
  41. data/lib/sparql/algebra/operator/desc.rb +1 -1
  42. data/lib/sparql/algebra/operator/describe.rb +2 -12
  43. data/lib/sparql/algebra/operator/distinct.rb +2 -12
  44. data/lib/sparql/algebra/operator/divide.rb +1 -1
  45. data/lib/sparql/algebra/operator/drop.rb +2 -2
  46. data/lib/sparql/algebra/operator/encode_for_uri.rb +2 -2
  47. data/lib/sparql/algebra/operator/equal.rb +2 -2
  48. data/lib/sparql/algebra/operator/exists.rb +1 -1
  49. data/lib/sparql/algebra/operator/exprlist.rb +1 -11
  50. data/lib/sparql/algebra/operator/extend.rb +3 -12
  51. data/lib/sparql/algebra/operator/filter.rb +3 -13
  52. data/lib/sparql/algebra/operator/floor.rb +2 -2
  53. data/lib/sparql/algebra/operator/graph.rb +4 -15
  54. data/lib/sparql/algebra/operator/greater_than.rb +5 -5
  55. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +5 -5
  56. data/lib/sparql/algebra/operator/group.rb +14 -14
  57. data/lib/sparql/algebra/operator/group_concat.rb +1 -1
  58. data/lib/sparql/algebra/operator/hours.rb +1 -1
  59. data/lib/sparql/algebra/operator/if.rb +1 -11
  60. data/lib/sparql/algebra/operator/in.rb +1 -11
  61. data/lib/sparql/algebra/operator/insert.rb +4 -4
  62. data/lib/sparql/algebra/operator/insert_data.rb +2 -2
  63. data/lib/sparql/algebra/operator/iri.rb +1 -1
  64. data/lib/sparql/algebra/operator/is_blank.rb +1 -1
  65. data/lib/sparql/algebra/operator/is_iri.rb +1 -1
  66. data/lib/sparql/algebra/operator/is_literal.rb +1 -1
  67. data/lib/sparql/algebra/operator/is_numeric.rb +1 -1
  68. data/lib/sparql/algebra/operator/is_triple.rb +30 -0
  69. data/lib/sparql/algebra/operator/join.rb +9 -7
  70. data/lib/sparql/algebra/operator/lang.rb +1 -1
  71. data/lib/sparql/algebra/operator/lang_matches.rb +3 -3
  72. data/lib/sparql/algebra/operator/lcase.rb +2 -2
  73. data/lib/sparql/algebra/operator/left_join.rb +16 -9
  74. data/lib/sparql/algebra/operator/less_than.rb +5 -5
  75. data/lib/sparql/algebra/operator/less_than_or_equal.rb +5 -5
  76. data/lib/sparql/algebra/operator/load.rb +2 -2
  77. data/lib/sparql/algebra/operator/max.rb +8 -1
  78. data/lib/sparql/algebra/operator/md5.rb +1 -1
  79. data/lib/sparql/algebra/operator/min.rb +8 -1
  80. data/lib/sparql/algebra/operator/minus.rb +9 -8
  81. data/lib/sparql/algebra/operator/minutes.rb +1 -1
  82. data/lib/sparql/algebra/operator/modify.rb +1 -1
  83. data/lib/sparql/algebra/operator/month.rb +1 -1
  84. data/lib/sparql/algebra/operator/move.rb +2 -2
  85. data/lib/sparql/algebra/operator/multiply.rb +1 -1
  86. data/lib/sparql/algebra/operator/negate.rb +1 -1
  87. data/lib/sparql/algebra/operator/not.rb +1 -1
  88. data/lib/sparql/algebra/operator/not_equal.rb +2 -2
  89. data/lib/sparql/algebra/operator/notexists.rb +2 -2
  90. data/lib/sparql/algebra/operator/notin.rb +1 -11
  91. data/lib/sparql/algebra/operator/notoneof.rb +2 -2
  92. data/lib/sparql/algebra/operator/now.rb +1 -1
  93. data/lib/sparql/algebra/operator/object.rb +27 -0
  94. data/lib/sparql/algebra/operator/or.rb +3 -3
  95. data/lib/sparql/algebra/operator/order.rb +2 -12
  96. data/lib/sparql/algebra/operator/path.rb +2 -2
  97. data/lib/sparql/algebra/operator/path_opt.rb +2 -2
  98. data/lib/sparql/algebra/operator/path_plus.rb +2 -2
  99. data/lib/sparql/algebra/operator/path_star.rb +2 -2
  100. data/lib/sparql/algebra/operator/plus.rb +2 -2
  101. data/lib/sparql/algebra/operator/predicate.rb +27 -0
  102. data/lib/sparql/algebra/operator/prefix.rb +8 -8
  103. data/lib/sparql/algebra/operator/project.rb +2 -12
  104. data/lib/sparql/algebra/operator/rand.rb +1 -1
  105. data/lib/sparql/algebra/operator/reduced.rb +2 -12
  106. data/lib/sparql/algebra/operator/regex.rb +5 -5
  107. data/lib/sparql/algebra/operator/replace.rb +3 -3
  108. data/lib/sparql/algebra/operator/reverse.rb +2 -2
  109. data/lib/sparql/algebra/operator/round.rb +2 -2
  110. data/lib/sparql/algebra/operator/same_term.rb +8 -5
  111. data/lib/sparql/algebra/operator/sample.rb +9 -2
  112. data/lib/sparql/algebra/operator/seconds.rb +1 -1
  113. data/lib/sparql/algebra/operator/seq.rb +1 -1
  114. data/lib/sparql/algebra/operator/sequence.rb +1 -1
  115. data/lib/sparql/algebra/operator/sha1.rb +1 -1
  116. data/lib/sparql/algebra/operator/sha256.rb +1 -1
  117. data/lib/sparql/algebra/operator/sha384.rb +1 -1
  118. data/lib/sparql/algebra/operator/sha512.rb +1 -1
  119. data/lib/sparql/algebra/operator/slice.rb +2 -12
  120. data/lib/sparql/algebra/operator/str.rb +1 -1
  121. data/lib/sparql/algebra/operator/strafter.rb +2 -2
  122. data/lib/sparql/algebra/operator/strbefore.rb +2 -2
  123. data/lib/sparql/algebra/operator/strdt.rb +2 -2
  124. data/lib/sparql/algebra/operator/strends.rb +2 -2
  125. data/lib/sparql/algebra/operator/strlang.rb +2 -2
  126. data/lib/sparql/algebra/operator/strlen.rb +2 -2
  127. data/lib/sparql/algebra/operator/strstarts.rb +2 -2
  128. data/lib/sparql/algebra/operator/struuid.rb +1 -1
  129. data/lib/sparql/algebra/operator/subject.rb +29 -0
  130. data/lib/sparql/algebra/operator/substr.rb +3 -3
  131. data/lib/sparql/algebra/operator/subtract.rb +1 -1
  132. data/lib/sparql/algebra/operator/sum.rb +1 -1
  133. data/lib/sparql/algebra/operator/table.rb +2 -2
  134. data/lib/sparql/algebra/operator/timezone.rb +1 -1
  135. data/lib/sparql/algebra/operator/triple.rb +27 -0
  136. data/lib/sparql/algebra/operator/tz.rb +1 -1
  137. data/lib/sparql/algebra/operator/ucase.rb +2 -2
  138. data/lib/sparql/algebra/operator/union.rb +7 -6
  139. data/lib/sparql/algebra/operator/update.rb +2 -2
  140. data/lib/sparql/algebra/operator/using.rb +2 -2
  141. data/lib/sparql/algebra/operator/uuid.rb +1 -1
  142. data/lib/sparql/algebra/operator/with.rb +3 -3
  143. data/lib/sparql/algebra/operator/year.rb +1 -1
  144. data/lib/sparql/algebra/query.rb +1 -1
  145. data/lib/sparql/algebra/update.rb +1 -1
  146. data/lib/sparql/algebra/version.rb +1 -1
  147. data/lib/sparql/extensions.rb +7 -13
  148. data/lib/sparql/grammar.rb +81 -6
  149. data/lib/sparql/grammar/meta.rb +5801 -1584
  150. data/lib/sparql/grammar/parser11.rb +116 -50
  151. data/lib/sparql/grammar/terminals11.rb +4 -0
  152. data/lib/sparql/results.rb +70 -43
  153. data/lib/sparql/version.rb +1 -1
  154. metadata +34 -39
@@ -6,8 +6,8 @@ module SPARQL::Grammar
6
6
  ##
7
7
  # A parser for the SPARQL 1.1 grammar.
8
8
  #
9
- # @see http://www.w3.org/TR/sparql11-query/#grammar
10
- # @see http://en.wikipedia.org/wiki/LR_parser
9
+ # @see https://www.w3.org/TR/sparql11-query/#grammar
10
+ # @see https://en.wikipedia.org/wiki/LR_parser
11
11
  class Parser
12
12
  include SPARQL::Grammar::Meta
13
13
  include SPARQL::Grammar::Terminals
@@ -23,6 +23,7 @@ module SPARQL::Grammar
23
23
  STRAFTER STRBEFORE STRDT STRENDS STRLANG STRLEN STRSTARTS STRUUID STR
24
24
  TIMEZONE TZ UCASE URI UUID YEAR
25
25
  isBLANK isIRI isURI isLITERAL isNUMERIC sameTerm
26
+ isTRIPLE TRIPLE SUBJECT PREDICATE OBJECT
26
27
  }.map {|s| s.downcase.to_sym}.freeze
27
28
 
28
29
  BUILTIN_RULES = [:aggregate, :regex, :substr, :replace, :exists, :notexists].freeze
@@ -184,6 +185,7 @@ module SPARQL::Grammar
184
185
  |STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|STRUUID|SUBSTR|STR|SUM
185
186
  |TIMEZONE|TZ|UCASE|UNDEF|URI|UUID|YEAR
186
187
  |isBLANK|isIRI|isURI|isLITERAL|isNUMERIC|sameTerm
188
+ |isTRIPLE|TRIPLE|SUBJECT|PREDICATE|OBJECT
187
189
  }x
188
190
  add_prod_datum(token.value.downcase.to_sym, token.value.downcase.to_sym)
189
191
  else
@@ -586,7 +588,7 @@ module SPARQL::Grammar
586
588
  production(:GroupGraphPatternSub) do |input, data, callback|
587
589
  debug("GroupGraphPatternSub") {"q #{data[:query].inspect}"}
588
590
 
589
- res = case data[:query].length
591
+ res = case Array(data[:query]).length
590
592
  when 0 then SPARQL::Algebra::Operator::BGP.new
591
593
  when 1 then data[:query].first
592
594
  when 2
@@ -647,7 +649,7 @@ module SPARQL::Grammar
647
649
  data[:input_query] = input.delete(:query) || [SPARQL::Algebra::Operator::BGP.new]
648
650
  end
649
651
  production(:GraphPatternNotTriples) do |input, data, callback|
650
- lhs = data[:input_query].first
652
+ lhs = Array(data[:input_query]).first
651
653
 
652
654
  # Filter trickls up to GroupGraphPatternSub
653
655
  add_prod_datum(:filter, data[:filter])
@@ -752,7 +754,7 @@ module SPARQL::Grammar
752
754
  end
753
755
  end
754
756
 
755
- # [65] DataBlockValue ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF'
757
+ # [65] DataBlockValue ::= EmbTD | iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF'
756
758
  production(:DataBlockValue) do |input, data, callback|
757
759
  add_prod_datum :DataBlockValue, data.values.first
758
760
  end
@@ -831,7 +833,7 @@ module SPARQL::Grammar
831
833
  add_prod_datum(:ConstructTemplate, data[:ConstructTemplate])
832
834
  end
833
835
 
834
- # [75] TriplesSameSubject ::= VarOrTerm PropertyListNotEmpty
836
+ # [75] TriplesSameSubject ::= VarOrTermOrEmbTP PropertyListNotEmpty
835
837
  # | TriplesNode PropertyList
836
838
  production(:TriplesSameSubject) do |input, data, callback|
837
839
  add_prod_datum(:pattern, data[:pattern])
@@ -840,8 +842,8 @@ module SPARQL::Grammar
840
842
  # [77] PropertyListNotEmpty ::= Verb ObjectList
841
843
  # ( ';' ( Verb ObjectList )? )*
842
844
  start_production(:PropertyListNotEmpty) do |input, data, callback|
843
- subject = input[:VarOrTerm] || input[:TriplesNode] || input[:GraphNode]
844
- error(nil, "Expected VarOrTerm or TriplesNode or GraphNode", production: :PropertyListNotEmpty) if validate? && !subject
845
+ subject = input[:VarOrTermOrEmbTP] || input[:TriplesNode] || input[:GraphNode]
846
+ error(nil, "Expected VarOrTermOrEmbTP or TriplesNode or GraphNode", production: :PropertyListNotEmpty) if validate? && !subject
845
847
  data[:Subject] = subject
846
848
  end
847
849
  production(:PropertyListNotEmpty) do |input, data, callback|
@@ -867,13 +869,17 @@ module SPARQL::Grammar
867
869
  add_prod_datum(:path, data[:path])
868
870
  end
869
871
 
870
- # [80] Object ::= GraphNode
872
+ # [80] Object ::= GraphNode AnnotationPattern?
873
+ start_production(:Object) do |input, data, callback|
874
+ data[:Subject] = Array(input[:Subject]).first
875
+ data[:Verb] = Array(input[:Verb]).first
876
+ end
871
877
  production(:Object) do |input, data, callback|
872
- object = data[:VarOrTerm] || data[:TriplesNode] || data[:GraphNode]
878
+ object = data[:GraphNode]
879
+ add_prod_datum(:pattern, data[:pattern])
873
880
  if object
874
881
  if prod_data[:Verb]
875
882
  add_pattern(:Object, subject: prod_data[:Subject], predicate: prod_data[:Verb], object: object)
876
- add_prod_datum(:pattern, data[:pattern])
877
883
  elsif prod_data[:VerbPath]
878
884
  add_prod_datum(:path,
879
885
  SPARQL::Algebra::Expression(:path,
@@ -883,8 +889,17 @@ module SPARQL::Grammar
883
889
  end
884
890
  end
885
891
  end
892
+ start_production(:_Object_1) do |input, data, callback|
893
+ pattern = RDF::Query::Pattern.new(input[:Subject], input[:Verb], input[:GraphNode].first)
894
+ error("ObjectPath", "Expected Verb",
895
+ production: :_Object_1) unless input[:Verb]
896
+ data[:TriplesNode] = [pattern]
897
+ end
898
+ production(:_Object_1) do |input, data, callback|
899
+ add_prod_datum(:pattern, data[:pattern])
900
+ end
886
901
 
887
- # [81] TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty | TriplesNode PropertyListPath
902
+ # [81] TriplesSameSubjectPath ::= VarOrTermOrEmbTP PropertyListPathNotEmpty | TriplesNode PropertyListPath
888
903
  production(:TriplesSameSubjectPath) do |input, data, callback|
889
904
  add_prod_datum(:pattern, data[:pattern])
890
905
  add_prod_datum(:path, data[:path])
@@ -892,8 +907,8 @@ module SPARQL::Grammar
892
907
 
893
908
  # [83] PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectList ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )*
894
909
  start_production(:PropertyListPathNotEmpty) do |input, data, callback|
895
- subject = input[:VarOrTerm] || input[:TriplesNode] || input[:GraphNode]
896
- error(nil, "Expected VarOrTerm, got nothing", production: :PropertyListPathNotEmpty) if validate? && !subject
910
+ subject = input[:VarOrTermOrEmbTP] || input[:TriplesNode] || input[:GraphNode]
911
+ error(nil, "Expected VarOrTermOrEmbTP, got nothing", production: :PropertyListPathNotEmpty) if validate? && !subject
897
912
  data[:Subject] = subject
898
913
  end
899
914
  production(:PropertyListPathNotEmpty) do |input, data, callback|
@@ -933,9 +948,13 @@ module SPARQL::Grammar
933
948
  add_prod_datum(:path, data[:path])
934
949
  end
935
950
 
936
- # [87] ObjectPath ::= GraphNodePath
951
+ # [87] ObjectPath ::= GraphNodePath AnnotationPatternPath?
952
+ start_production(:ObjectPath) do |input, data, callback|
953
+ data[:Subject] = Array(input[:Subject]).first
954
+ data[:Verb] = Array(input[:Verb]).first
955
+ end
937
956
  production(:ObjectPath) do |input, data, callback|
938
- object = data[:VarOrTerm] || data[:TriplesNode] || data[:GraphNode]
957
+ object = data[:VarOrTermOrEmbTP] || data[:TriplesNode] || data[:GraphNode]
939
958
  if object
940
959
  if prod_data[:Verb]
941
960
  if data[:pattern] && data[:path]
@@ -943,6 +962,9 @@ module SPARQL::Grammar
943
962
  data[:pattern].unshift(RDF::Query::Pattern.new(prod_data[:Subject].first, prod_data[:Verb], object.first))
944
963
  bgp = SPARQL::Algebra::Expression[:bgp, data[:pattern]]
945
964
  add_prod_datum(:path, SPARQL::Algebra::Expression[:sequence, bgp, *data[:path]])
965
+ elsif data[:path]
966
+ # AnnotationPatternPath case
967
+ add_prod_datum(:path, data[:path])
946
968
  else
947
969
  add_pattern(:Object, subject: prod_data[:Subject], predicate: prod_data[:Verb], object: object)
948
970
  add_prod_datum(:pattern, data[:pattern])
@@ -956,6 +978,16 @@ module SPARQL::Grammar
956
978
  end
957
979
  end
958
980
  end
981
+ start_production(:_ObjectPath_1) do |input, data, callback|
982
+ pattern = RDF::Query::Pattern.new(input[:Subject], input[:Verb], input[:GraphNode].first)
983
+ error("ObjectPath", "Expected Verb",
984
+ production: :_ObjectPath_1) unless input[:Verb]
985
+ data[:TriplesNode] = [pattern]
986
+ end
987
+ production(:_ObjectPath_1) do |input, data, callback|
988
+ add_prod_datum(:pattern, data[:pattern])
989
+ end
990
+
959
991
  # [88] Path ::= PathAlternative
960
992
  # output is a :Path or :iri
961
993
  production(:Path) do |input, data, callback|
@@ -1084,24 +1116,24 @@ module SPARQL::Grammar
1084
1116
  add_prod_datum(:path, data[:path])
1085
1117
  end
1086
1118
 
1087
- # [104] GraphNode ::= VarOrTerm | TriplesNode
1119
+ # [104] GraphNode ::= VarOrTermOrEmbTP | TriplesNode
1088
1120
  production(:GraphNode) do |input, data, callback|
1089
- term = data[:VarOrTerm] || data[:TriplesNode]
1121
+ term = data[:VarOrTermOrEmbTP] || data[:TriplesNode]
1090
1122
  add_prod_datum(:pattern, data[:pattern])
1091
1123
  add_prod_datum(:GraphNode, term)
1092
1124
  end
1093
1125
 
1094
- # [105] GraphNodePath ::= VarOrTerm | TriplesNodePath
1126
+ # [105] GraphNodePath ::= VarOrTermOrEmbTP | TriplesNodePath
1095
1127
  production(:GraphNodePath) do |input, data, callback|
1096
- term = data[:VarOrTerm] || data[:TriplesNode]
1128
+ term = data[:VarOrTermOrEmbTP] || data[:TriplesNode]
1097
1129
  add_prod_datum(:pattern, data[:pattern])
1098
1130
  add_prod_datum(:path, data[:path])
1099
1131
  add_prod_datum(:GraphNode, term)
1100
1132
  end
1101
1133
 
1102
- # [106] VarOrTerm ::= Var | GraphTerm
1103
- production(:VarOrTerm) do |input, data, callback|
1104
- data.values.each {|v| add_prod_datum(:VarOrTerm, v)}
1134
+ # [106s] VarOrTermOrEmbTP ::= Var | GraphTerm | EmbTP
1135
+ production(:VarOrTermOrEmbTP) do |input, data, callback|
1136
+ data.values.each {|v| add_prod_datum(:VarOrTermOrEmbTP, v)}
1105
1137
  end
1106
1138
 
1107
1139
  # [107] VarOrIri ::= Var | iri
@@ -1119,6 +1151,22 @@ module SPARQL::Grammar
1119
1151
  data[:NIL])
1120
1152
  end
1121
1153
 
1154
+ # [174] EmbTP ::= '<<' EmbSubjectOrObject Verb EmbSubjectOrObject '>>'
1155
+ production(:EmbTP) do |input, data, callback|
1156
+ subject, object = data[:EmbSubjectOrObject]
1157
+ predicate = data[:Verb]
1158
+ add_pattern(:EmbTP,
1159
+ subject: subject,
1160
+ predicate: predicate,
1161
+ object: object)
1162
+ end
1163
+
1164
+ # [175] EmbSubjectOrObject ::= Var | BlankNode | iri | RDFLiteral
1165
+ # | NumericLiteral | BooleanLiteral | EmbTP
1166
+ production(:EmbSubjectOrObject) do |input, data, callback|
1167
+ data.values.each {|v| add_prod_datum(:EmbSubjectOrObject, v)}
1168
+ end
1169
+
1122
1170
  # [110] Expression ::= ConditionalOrExpression
1123
1171
  production(:Expression) do |input, data, callback|
1124
1172
  add_prod_datum(:Expression, data[:Expression])
@@ -1258,6 +1306,7 @@ module SPARQL::Grammar
1258
1306
  # | iriOrFunction | RDFLiteral
1259
1307
  # | NumericLiteral | BooleanLiteral
1260
1308
  # | Var
1309
+ # | EmbTP
1261
1310
  production(:PrimaryExpression) do |input, data, callback|
1262
1311
  if data[:Expression]
1263
1312
  add_prod_datum(:Expression, data[:Expression])
@@ -1271,6 +1320,8 @@ module SPARQL::Grammar
1271
1320
  add_prod_datum(:Expression, data[:literal])
1272
1321
  elsif data[:Var]
1273
1322
  add_prod_datum(:Expression, data[:Var])
1323
+ elsif data[:pattern]
1324
+ add_prod_datum(:Expression, data[:pattern])
1274
1325
  end
1275
1326
 
1276
1327
  # Keep track of this for parent UnaryExpression production
@@ -1441,6 +1492,43 @@ module SPARQL::Grammar
1441
1492
  add_prod_datum(:UnaryExpression, data[:UnaryExpression])
1442
1493
  end
1443
1494
 
1495
+ # [177] AnnotationPattern ::= '{|' PropertyListNotEmpty '|}'
1496
+ #start_production(:AnnotationPattern) do |input, data, callback|
1497
+ # data[:TriplesNode] = prod_data[:TriplesNode].first
1498
+ #end
1499
+ #production(:AnnotationPattern) do |input, data, callback|
1500
+ # add_prod_datum(:pattern, data[:pattern])
1501
+ #end
1502
+
1503
+ # [178] AnnotationPatternPath ::= '{|' PropertyListPathNotEmpty '|}'
1504
+ start_production(:AnnotationPatternPath) do |input, data, callback|
1505
+ data[:TriplesNode] = input[:TriplesNode]
1506
+ end
1507
+ production(:AnnotationPatternPath) do |input, data, callback|
1508
+ if data[:pattern]
1509
+ add_prod_datum(:pattern, data[:pattern])
1510
+ elsif data[:path]
1511
+ # Replace the subject in the path with the node being annotated.
1512
+ data[:path].first.operands[0] = data[:TriplesNode]
1513
+ add_prod_datum(:path, data[:path])
1514
+ end
1515
+ end
1516
+
1517
+ # [179] EmbTD ::= '<<' DataValueTerm ( iri | 'a' ) DataValueTerm '>>'
1518
+ production(:EmbTD) do |input, data, callback|
1519
+ subject, object = data[:DataValueTerm]
1520
+ predicate = data[:iri]
1521
+ add_pattern(:EmbTD,
1522
+ subject: subject,
1523
+ predicate: predicate,
1524
+ object: object)
1525
+ end
1526
+
1527
+ # [180] DataValueTerm ::= EmbTD | iri | RDFLiteral | NumericLiteral | BooleanLiteral
1528
+ production(:DataValueTerm) do |input, data, callback|
1529
+ add_prod_datum :DataValueTerm, data.values.first
1530
+ end
1531
+
1444
1532
  ##
1445
1533
  # Initializes a new parser instance.
1446
1534
  #
@@ -1458,10 +1546,8 @@ module SPARQL::Grammar
1458
1546
  # definitions.
1459
1547
  # @option options [Boolean] :validate (false)
1460
1548
  # whether to validate the parsed statements and values
1461
- # @option options [Boolean] :progress
1462
- # Show progress of parser productions
1463
- # @option options [Boolean] :debug
1464
- # Detailed debug output
1549
+ # @option options [Logger, #write, #<<] :logger
1550
+ # Record error/info/debug output
1465
1551
  # @yield [parser] `self`
1466
1552
  # @yieldparam [SPARQL::Grammar::Parser] parser
1467
1553
  # @yieldreturn [void] ignored
@@ -1473,10 +1559,6 @@ module SPARQL::Grammar
1473
1559
  end
1474
1560
  @input.encode!(Encoding::UTF_8) if @input.respond_to?(:encode!)
1475
1561
  @options = {anon_base: "b0", validate: false}.merge(options)
1476
- @options[:debug] ||= case
1477
- when options[:progress] then 2
1478
- when options[:validate] then 1
1479
- end
1480
1562
 
1481
1563
  debug("base IRI") {base_uri.inspect}
1482
1564
  debug("validate") {validate?.inspect}
@@ -1527,8 +1609,8 @@ module SPARQL::Grammar
1527
1609
  # @param [Symbol, #to_s] prod The starting production for the parser.
1528
1610
  # It may be a URI from the grammar, or a symbol representing the local_name portion of the grammar URI.
1529
1611
  # @return [Array]
1530
- # @see http://www.w3.org/TR/sparql11-query/#sparqlAlgebra
1531
- # @see http://axel.deri.ie/sparqltutorial/ESWC2007_SPARQL_Tutorial_unit2b.pdf
1612
+ # @see https://www.w3.org/TR/sparql11-query/#sparqlAlgebra
1613
+ # @see https://axel.deri.ie/sparqltutorial/ESWC2007_SPARQL_Tutorial_unit2b.pdf
1532
1614
  def parse(prod = START)
1533
1615
  ll1_parse(@input,
1534
1616
  prod.to_sym,
@@ -1537,23 +1619,7 @@ module SPARQL::Grammar
1537
1619
  follow: FOLLOW,
1538
1620
  whitespace: WS,
1539
1621
  **@options
1540
- ) do |context, *data|
1541
- case context
1542
- when :trace
1543
- level, lineno, depth, *args = data
1544
- message = args.to_sse
1545
- d_str = depth > 100 ? ' ' * 100 + '+' : ' ' * depth
1546
- str = "[#{lineno}](#{level})#{d_str}#{message}".chop
1547
- case @options[:debug]
1548
- when Array
1549
- @options[:debug] << str unless level > 2
1550
- when TrueClass
1551
- $stderr.puts str
1552
- when Integer
1553
- $stderr.puts(str) if level <= @options[:debug]
1554
- end
1555
- end
1556
- end
1622
+ )
1557
1623
 
1558
1624
  # The last thing on the @prod_data stack is the result
1559
1625
  @result = case
@@ -108,8 +108,11 @@ module SPARQL::Grammar
108
108
  |TIMEZONE|TO|TZ|UCASE|UNDEF|UNION|URI|USING|UUID|VALUES
109
109
  |WHERE|WITH|YEAR
110
110
  |isBLANK|isIRI|isURI|isLITERAL|isNUMERIC|sameTerm
111
+ |isTRIPLE|TRIPLE|SUBJECT|PREDICATE|OBJECT
111
112
  |true
112
113
  |false
114
+ |<<|>>
115
+ |\{\||\|\}
113
116
  |&&|!=|!|<=|>=|\^\^|\|\||[\(\),.;\[\]\{\}\+\-=<>\?\^\|\*\/a]
114
117
  )xim.freeze
115
118
 
@@ -131,6 +134,7 @@ module SPARQL::Grammar
131
134
  TIMEZONE TO TZ UCASE UNDEF UNION URI USING UUID
132
135
  VALUES WHERE WITH YEAR
133
136
  isBLANK isIRI isURI isLITERAL isNUMERIC sameTerm
137
+ isTRIPLE TRIPLE SUBJECT PREDICATE OBJECT
134
138
  true false
135
139
  } + [
136
140
  "DELETE DATA",
@@ -14,28 +14,38 @@ module SPARQL
14
14
  ##
15
15
  # Generate Solutions as JSON
16
16
  # @return [String]
17
- # @see http://www.w3.org/TR/rdf-sparql-json-res/
17
+ # @see https://www.w3.org/TR/rdf-sparql-json-res/
18
18
  def to_json
19
19
  require 'json' unless defined?(::JSON)
20
-
21
- bindings = self.map do |solution|
22
- variable_names.inject({}) do |memo, n|
23
- memo.merge case s = solution[n]
24
- when RDF::URI
25
- {n => {type: "uri", value: s.to_s }}
26
- when RDF::Node
27
- {n => {type: "bnode", value: s.id }}
28
- when RDF::Literal
29
- if s.datatype?
30
- {n => {type: "typed-literal", datatype: s.datatype.to_s, value: s.to_s }}
31
- elsif s.language
32
- {n => {type: "literal", "xml:lang" => s.language.to_s, value: s.to_s }}
33
- else
34
- {n => {type: "literal", value: s.to_s }}
35
- end
20
+
21
+ format = ->(value) do
22
+ case value
23
+ when RDF::URI then {type: "uri", value: value.to_s }
24
+ when RDF::Node then {type: "bnode", value: value.id }
25
+ when RDF::Literal
26
+ if value.datatype?
27
+ {type: "typed-literal", datatype: value.datatype.to_s, value: value.to_s }
28
+ elsif value.language?
29
+ {type: "literal", "xml:lang" => value.language.to_s, value: value.to_s }
36
30
  else
37
- {}
31
+ {type: "literal", value: value.to_s }
38
32
  end
33
+ when RDF::Statement
34
+ {
35
+ type: 'triple',
36
+ value: {
37
+ subject: format.call(value.subject),
38
+ predicate: format.call(value.predicate),
39
+ object: format.call(value.object)
40
+ }
41
+ }
42
+ end
43
+ end
44
+
45
+ bindings = self.map do |solution|
46
+ variable_names.inject({}) do |memo, n|
47
+ rep = format.call(solution[n])
48
+ rep ? memo.merge(n => rep) : memo
39
49
  end
40
50
  end
41
51
 
@@ -48,12 +58,36 @@ module SPARQL
48
58
  ##
49
59
  # Generate Solutions as XML
50
60
  # @return [String]
51
- # @see http://www.w3.org/TR/rdf-sparql-XMLres/
61
+ # @see https://www.w3.org/TR/rdf-sparql-XMLres/
52
62
  def to_xml
53
63
  require 'builder' unless defined?(::Builder)
54
64
 
55
65
  xml = ::Builder::XmlMarkup.new(indent: 2)
56
66
  xml.instruct!
67
+
68
+ format = ->(s) do
69
+ case s
70
+ when RDF::URI
71
+ xml.uri(s.to_s)
72
+ when RDF::Node
73
+ xml.bnode(s.id)
74
+ when RDF::Literal
75
+ if s.datatype?
76
+ xml.literal(s.to_s, "datatype" => s.datatype.to_s)
77
+ elsif s.language
78
+ xml.literal(s.to_s, "xml:lang" => s.language.to_s)
79
+ else
80
+ xml.literal(s.to_s)
81
+ end
82
+ when RDF::Statement
83
+ xml.triple do
84
+ xml.subject {format.call(s.subject)}
85
+ xml.predicate {format.call(s.predicate)}
86
+ xml.object {format.call(s.object)}
87
+ end
88
+ end
89
+ end
90
+
57
91
  xml.sparql(xmlns: "http://www.w3.org/2005/sparql-results#") do
58
92
  xml.head do
59
93
  variable_names.each do |n|
@@ -67,20 +101,7 @@ module SPARQL
67
101
  s = solution[n]
68
102
  next unless s
69
103
  xml.binding(name: n) do
70
- case s
71
- when RDF::URI
72
- xml.uri(s.to_s)
73
- when RDF::Node
74
- xml.bnode(s.id)
75
- when RDF::Literal
76
- if s.datatype?
77
- xml.literal(s.to_s, "datatype" => s.datatype.to_s)
78
- elsif s.language
79
- xml.literal(s.to_s, "xml:lang" => s.language.to_s)
80
- else
81
- xml.literal(s.to_s)
82
- end
83
- end
104
+ format.call(s)
84
105
  end
85
106
  end
86
107
  end
@@ -118,10 +139,9 @@ module SPARQL
118
139
  ##
119
140
  # Generate Solutions as CSV
120
141
  # @return [String]
121
- # @see http://www.w3.org/TR/rdf-sparql-json-res/#results
122
- def to_csv
142
+ # @see https://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/
143
+ def to_csv(bnode_map: {})
123
144
  require 'csv' unless defined?(::CSV)
124
- bnode_map = {}
125
145
  bnode_gen = "_:a"
126
146
  CSV.generate(row_sep: "\r\n") do |csv|
127
147
  csv << variable_names.to_a
@@ -134,8 +154,12 @@ module SPARQL
134
154
  bnode_gen = bnode_gen.succ
135
155
  this
136
156
  end
157
+ when RDF::Statement
158
+ RDF::Query::Solutions(
159
+ RDF::Query::Solution.new(subject: term.subject, predicate: term.predicate, object: term.object)
160
+ ).to_csv(bnode_map: bnode_map).split.last.strip
137
161
  else
138
- solution[n].to_s
162
+ solution[n].to_s.strip
139
163
  end
140
164
  end
141
165
  end
@@ -144,11 +168,9 @@ module SPARQL
144
168
  ##
145
169
  # Generate Solutions as TSV
146
170
  # @return [String]
147
- # @see http://www.w3.org/TR/rdf-sparql-json-res/#results
171
+ # @see https://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/
148
172
  def to_tsv
149
173
  require 'csv' unless defined?(::CSV)
150
- bnode_map = {}
151
- bnode_gen = "_:a"
152
174
  results = [
153
175
  variable_names.map {|v| "?#{v}"}.join("\t")
154
176
  ] + self.map do |solution|
@@ -156,10 +178,15 @@ module SPARQL
156
178
  case term = solution[n]
157
179
  when RDF::Literal::Integer, RDF::Literal::Decimal, RDF::Literal::Double
158
180
  term.canonicalize.to_s
181
+ when RDF::Statement
182
+ emb_stmt = RDF::Query::Solutions(
183
+ RDF::Query::Solution.new(subject: term.subject, predicate: term.predicate, object: term.object)
184
+ ).to_tsv.split("\n").last.strip
185
+ emb_stmt.gsub(/[\t\n\r]/, "\t" => '\t', "\n" => '\n', "\r" => '\r')
159
186
  when nil
160
187
  ""
161
188
  else
162
- RDF::NTriples.serialize(term)
189
+ RDF::NTriples.serialize(term).strip.gsub(/[\t\n\r]/, "\t" => '\t', "\n" => '\n', "\r" => '\r')
163
190
  end
164
191
  end.join("\t")
165
192
  end
@@ -226,7 +253,7 @@ module SPARQL
226
253
  when RDF::Queryable
227
254
  begin
228
255
  require 'linkeddata'
229
- rescue LoadError => e
256
+ rescue LoadError
230
257
  require 'rdf/ntriples'
231
258
  end
232
259
  fmt = RDF::Format.for(format ? format.to_sym : {content_type: content_type})
@@ -280,7 +307,7 @@ module SPARQL
280
307
  # @param [Array<String>] available
281
308
  # @return [String]
282
309
  #
283
- # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
310
+ # @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
284
311
  def first_content_type(acceptable, available)
285
312
  return acceptable.first if available.empty?
286
313
  available.flatten!