Module: GRel::QL

Defined in:
lib/grel/ql.rb

Defined Under Namespace

Classes: BGP, Filter, QueryContext

Class Method Summary collapse

Class Method Details

.from_binding_hash(node) ⇒ Object

end of from_binding_value



868
869
870
871
872
873
874
875
876
877
878
879
# File 'lib/grel/ql.rb', line 868

def self.from_binding_hash(node)
  node = node.raw_json if node.respond_to?(:raw_json)
  node.delete("@context")
  node = node.to_a.inject({}) do |ac, (p,v)|
    p = p[1..-1].to_sym if(p.index(":") == 0)
    p = p.split("#").last.to_sym if(p.index("#"))
    p = p.to_sym if(p == "@id" || p == "@type")
    v = from_binding_value(v)
    ac[p] = v; ac
  end
  node
end

.from_binding_to_id(obj) ⇒ Object



814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
# File 'lib/grel/ql.rb', line 814

def self.from_binding_to_id(obj)
  if(!obj.is_a?(String))
    obj
  elsif(obj == "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil")
    nil
  elsif(obj.index("http://grel.org/ids/id/"))
    val = URI.unescape(obj.split("http://grel.org/ids/id/").last)
    "@id(#{val})"
  elsif(obj.index("http://grel.org/ids/"))
    URI.unescape(obj.split("http://grel.org/ids/").last)
  elsif(obj.index("http://grel.org/vocabulary#"))
    obj.split("http://grel.org/vocabulary#").last.to_sym
  else
    obj
  end
end

.from_binding_value(obj) ⇒ Object



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
# File 'lib/grel/ql.rb', line 831

def self.from_binding_value(obj)
  if(obj.is_a?(Hash) && obj["@id"])
    from_binding_hash(obj)
  elsif(obj.is_a?(Hash) && obj["@type"])
    if(obj["@type"] == "http://www.w3.org/2001/XMLSchema#dateTime")
      Time.parse(obj["@value"])
    elsif(obj["@type"] == "http://www.w3.org/2001/XMLSchema#integer")
      obj["@value"].to_i
    elsif(obj["@type"] == "http://www.w3.org/2001/XMLSchema#float")
      obj["@value"].to_f
    elsif(obj["@type"] == "http://www.w3.org/2001/XMLSchema#boolean")
      (obj["@value"] == "true" ? true : false)
    else
      obj["@value"]
    end
  elsif(obj.is_a?(Hash) && obj["@value"])
    val = obj["@value"]
    if(val == "true")
      true
    elsif(val == "false")
      false
    elsif(val =~ /^\d+\.\d*$/)
      val.to_f
    elsif(val =~ /^d+$/)
      val.to_i
    elsif(val == "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil")
      nil
    else
      val
    end
  elsif(obj.is_a?(Array))
    obj.map{|o| from_binding_value(o)}
  else
    from_binding_to_id(obj)
  end
end

.from_bindings_to_nodes(bindings, context, options = {}) ⇒ Object



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
# File 'lib/grel/ql.rb', line 881

def self.from_bindings_to_nodes(bindings,context, options = {})
  unlinked = options[:unlinked] || false
  nodes = {}
  uris = {}
  json = bindings
  json = [json] unless json.is_a?(Array)
  json.each do|node|
    node.each_pair do |k,v|
      # weird things happening with describe queries and arrays
      if(v.is_a?(Array))
        v = v.uniq
        v = v.first if v.length ==1
        node[k] = v
      end
    end

    node = from_binding_hash(node)
    nodes[node[:@id]] = node
    node.delete(:@id) unless node[:@id].index("@id(")
  end

  nodes.each do |(node_id,node)|       
    node.each_pair do |k,v|
      # weird things happening with describe queries and arrays
      if(v.is_a?(Array))
        v = v.uniq
        v = v.first if v.length ==1
        node[k] = v
      end

      if(v.is_a?(Hash) && v[:@id] && nodes[v[:@id]])
        node[k] = nodes[v[:@id]]
        nodes.delete(v[:@id]) if unlinked
      elsif(v.is_a?(Hash) && v[:@id])
        node[k] = from_binding_to_id(v[:@id])
      elsif(v.is_a?(Array))
        node[k] = v.map do |o|
          # recursive execution for each element in the array
          if(o.is_a?(Hash) && o[:@id] && nodes[o[:@id]])
            to_link = nodes[o[:@id]]
            nodes.delete(o[:@id]) if unlinked
            to_link
          elsif(o.is_a?(Hash) && o[:@id])
            from_binding_to_id(o[:@id])
          else
            o
          end
        end
      end
    end
  end

  nodes.values
end

.from_tuple_binding(tuple_value) ⇒ Object

end of to_query



801
802
803
804
805
806
807
808
809
810
811
812
# File 'lib/grel/ql.rb', line 801

def self.from_tuple_binding(tuple_value)
  if(tuple_value["type"] == "uri")
    from_binding_to_id(tuple_value["value"])
  elsif(tuple_value["datatype"])
    tuple_value["@type"] = tuple_value["datatype"]
    tuple_value["@value"] = tuple_value["value"]
    from_binding_value(tuple_value)
  else
    tuple_value["@value"] = tuple_value["value"]
    from_binding_value(tuple_value)
  end
end

.to_id(obj) ⇒ Object



126
127
128
129
130
131
132
# File 'lib/grel/ql.rb', line 126

def self.to_id(obj)
  if(obj =~ ID_REGEX)
    "<http://grel.org/ids/id/#{URI.encode(ID_REGEX.match(obj)[1])}>"
  else
    "<http://grel.org/ids/#{URI.encode(obj)}>"
  end
end

.to_query(obj, context = QL::QueryContext.new, inverse = false) ⇒ Object

end of BGP



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
# File 'lib/grel/ql.rb', line 743

def self.to_query(obj, context=QL::QueryContext.new, inverse=false)
  top_level = context.top_level
  context.top_level = false
  if(obj.is_a?(Symbol))
    if(obj == :@type)
      "rdf:type"
    elsif(obj == :@same_as)
      "<http://www.w3.org/2002/07/owl#sameAs>"
    elsif(obj.to_s.index("$inv_"))
      ":#{obj.to_s.split("$inv_").last}"
    elsif(obj.to_s == "_")
      "?X_#{obj.to_s.split('_').last}_#{context.next_node_id}"
    elsif(obj.to_s.index("_"))
      "?#{obj.to_s.split("_").drop(1).join("_")}"
    else
      ":#{obj}"
    end
  elsif(obj.is_a?(String))
    if(obj =~ ID_REGEX)
      QL.to_id(obj)
    else
      "\"#{obj}\""
    end
  elsif(obj.is_a?(Float))
    "\"#{obj}\"^^<http://www.w3.org/2001/XMLSchema#float>"
  elsif(obj.is_a?(Numeric))
    "\"#{obj}\"^^<http://www.w3.org/2001/XMLSchema#integer>"
  elsif(obj.is_a?(Time))
    "\"#{obj.iso8601}\"^^<http://www.w3.org/2001/XMLSchema#dateTime>"
  elsif(obj.is_a?(Date))
    "\"#{Time.new(obj.to_s).iso8601}\"^^<http://www.w3.org/2001/XMLSchema#dateTime>"
  elsif(obj.is_a?(Array))
    # TODO
  elsif(obj.is_a?(Hash))
    if(Filter.filter?(obj))
      filter = Filter.new(context)
      filter.parse(obj)
      filter
    else
      bgp = BGP.new(obj,context,inverse)
      next_triples = bgp.to_query
      # avoid patterns [?s1 ?p1 ?o1] where ?s1 is already linked in ?s0 ?p0 ?s1
      # they fail for SWRL rules in DESCRIBE queries
      unless(top_level == false && next_triples.length == 1 && 
             next_triples.first.reject{|c| c.index("?")==0 && c.index("_mg_") }.empty?)
        context.append(next_triples)
      end
      context
    end
  else
    if(obj.respond_to?(:to_query))
      obj.to_query(context)
    else
      "\"#{obj}\""
    end
  end
end

.to_rules(obj, context = {}) ⇒ Object



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
# File 'lib/grel/ql.rb', line 4

def self.to_rules(obj,context={})
  if(obj.is_a?(String) && obj[0..0] == "?")
    var_name = obj[1..-1]
    axiom = "<swrl:Variable rdf:about=\"http://www.w3.org/2003/11/swrl##{obj[1..-1]}\"></swrl:Variable>"
    context[var_name] = axiom
    "http://www.w3.org/2003/11/swrl##{obj[1..-1]}"
  elsif(obj.is_a?(Symbol))
    "##{obj}"
  elsif(obj.is_a?(Array))
    if(obj.first.is_a?(Symbol))
      elem = obj.first
      if(elem.to_s[0] == "$")
        pred = case elem
               when :$lt
                 "<swrl:BuiltinAtom><swrl:builtin rdf:resource=\"http://www.w3.org/2003/11/swrlb#lessThan\"/><swrl:arguments ><rdf:List>ARGS</rdf:List></swrl:arguments></swrl:BuiltinAtom>"
               when :$gt
                 "<swrl:BuiltinAtom><swrl:builtin rdf:resource=\"http://www.w3.org/2003/11/swrlb#greaterThan\"/><swrl:arguments ><rdf:List>ARGS</rdf:List></swrl:arguments></swrl:BuiltinAtom>"
               when :$lte
                 "<swrl:BuiltinAtom><swrl:builtin rdf:resource=\"http://www.w3.org/2003/11/swrlb#lessThanOrEqual\"/><swrl:arguments ><rdf:List>ARGS</rdf:List></swrl:arguments></swrl:BuiltinAtom>"              
               when :$gte
                 "<swrl:BuiltinAtom><swrl:builtin rdf:resource=\"http://www.w3.org/2003/11/swrlb#greaterThanOrEqual\"/><swrl:arguments ><rdf:List>ARGS</rdf:List></swrl:arguments></swrl:BuiltinAtom>"              
               when :$eq
                 "<swrl:BuiltinAtom><swrl:builtin rdf:resource=\"http://www.w3.org/2003/11/swrlb#equal\"/><swrl:arguments ><rdf:List>ARGS</rdf:List></swrl:arguments></swrl:BuiltinAtom>"              
               when :$neq
                 "<swrl:BuiltinAtom><swrl:builtin rdf:resource=\"http://www.w3.org/2003/11/swrlb#notEqual\"/><swrl:arguments ><rdf:List>ARGS</rdf:List></swrl:arguments></swrl:BuiltinAtom>"              
               end

        args = []
        
        if(obj[1].is_a?(String) && obj[1][0] == "?")
          args << "<rdf:first rdf:resource=\"#{GRel::QL.to_rules(obj[1], context)}\" />"
        else
          args << GRel::QL.to_rules(obj[1],context).gsub("swrl:argumentn","rdf:first")
        end

        if(obj[2].is_a?(String) && obj[2][0] == "?")
          args << "<rdf:rest><rdf:List><rdf:first rdf:resource=\"#{GRel::QL.to_rules(obj[2],context)}\"/><rdf:rest rdf:resource=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#nil\"/></rdf:List></rdf:rest>"
        else
          args << "<rdf:rest><rdf:List>#{GRel::QL.to_rules(obj[2],context).gsub("swrl:argumentn","rdf:first")}<rdf:rest rdf:resource=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#nil\"/></rdf:List></rdf:rest>"
        end

        pred.gsub(">ARGS<",">#{args.join}<")
      elsif(elem.to_s.capitalize == elem.to_s)  # is a class atom
        pred = "<swrl:classAtom><swrl:classPredicate rdf:resource=\"#{GRel::QL.to_rules(elem,context)}\" />"
        pred += "<swrl:argument1 rdf:resource=\"#{GRel::QL.to_rules(obj[1],context)}\" />"
        pred + "</swrl:classAtom>"
      elsif(elem.to_s.capitalize != elem.to_s) # is a property axiom
        is_data = obj[1..-1].detect{|e| !e.is_a?(String) || ( e.is_a?(String) && e[0] != "?" && e.index("@id") != 0 ) }
        if(is_data) # data property
          pred = "<swrl:DatavaluedPropertyAtom>"
          pred += "<swrl:propertyPredicate rdf:resource=\"http://grel.org/vocabulary#{GRel::QL.to_rules(elem,context)}\"/>"
          if(obj[1].is_a?(String) && (obj[1][0] == "?" || obj[1].index("@id")==0))
            pred += "<swrl:argument1 rdf:resource=\"#{GRel::QL.to_rules(obj[1], context)}\" />"
          else
            pred +=  GRel::QL.to_rules(obj[1], context).gsub("argumentn","argument1")
          end
          if(obj[2].is_a?(String) && (obj[2][0] == "?" || obj[2].index("@id")==0))
            pred += "<swrl:argument1 rdf:resource=\"#{GRel::QL.to_rules(obj[2], context)}\" />"
          else
            pred +=  GRel::QL.to_rules(obj[2], context).gsub("argumentn","argument2")               
          end
          pred + "</swrl:DatavaluedPropertyAtom>"
        else # individual property
          pred = "<swrl:IndividualPropertyAtom>"
          pred += "<swrl:propertyPredicate rdf:resource=\"http://grel.org/vocabulary#{GRel::QL.to_rules(elem,context)}\"/>"
          pred += "<swrl:argument1 rdf:resource=\"#{GRel::QL.to_rules(obj[1],context)}\" />"
          pred += "<swrl:argument2 rdf:resource=\"#{GRel::QL.to_rules(obj[2],context)}\" />"
          pred + "</swrl:IndividualPropertyAtom>"
          is_object = obj[1..-1].detect{|e| !e.is_a?(String) && ( e.is_a?(String) && e.index("@id") != 0 ) }
          unless(is_object)               
            pred = "<swrl:DatavaluedPropertyAtom>"
            pred += "<swrl:propertyPredicate rdf:resource=\"http://grel.org/vocabulary#{GRel::QL.to_rules(elem,context)}\"/>"
            pred += "<swrl:argument1 rdf:resource=\"#{GRel::QL.to_rules(obj[1],context)}\" />"
            pred += "<swrl:argument2 rdf:resource=\"#{GRel::QL.to_rules(obj[2],context)}\" />"
            pred + "</swrl:DatavaluedPropertyAtom>"
          end
        end
      else
        raise Exception.new("Unkown rule axiom #{obj.inspect}")
      end
    elsif(obj.first.is_a?(Array))
      obj.map{|ax| GRel::QL.to_rules(ax,context)}.join("")
    else
      raise Exception.new("Unkown rule axiom #{obj.inspect}")
    end
  elsif(obj.is_a?(String) && obj.index("@id")==0) # is a IRI
    GRel::QL::to_id(obj).gsub("<","").gsub(">","")
  elsif(obj.is_a?(String)) # is a IRI
    "<swrl:argumentn rdf:datatype=\"http://www.w3.org/2001/XMLSchema#string\">#{obj}</swrl:argumentn>"
  elsif(obj == true || obj == false)
    "<swrl:argumentn rdf:datatype=\"http://www.w3.org/2001/XMLSchema#boolean\">#{obj}</swrl:argumentn>"
  elsif(obj.is_a?(Float))
    "<swrl:argumentn rdf:datatype=\"http://www.w3.org/2001/XMLSchema#float\">#{obj}</swrl:argumentn>"
  elsif(obj.is_a?(Numeric))
    "<swrl:argumentn rdf:datatype=\"http://www.w3.org/2001/XMLSchema#integer\">#{obj}</swrl:argumentn>"
  elsif(obj.is_a?(Time))
    "<swrl:argumentn rdf:datatype=\"http://www.w3.org/2001/XMLSchema#dateTime\">#{obj.iso8601}</swrl:argumentn>"
  elsif(obj.is_a?(Date))
    "<swrl:argumentn rdf:datatype=\"http://www.w3.org/2001/XMLSchema#dateTime\">#{Time.new(obj.to_s).iso8601}</swrl:argumentn>"
  # Building the document here
  elsif(obj.is_a?(Hash))
    rules = obj.map do |(body,head)|
      "<swrl:Imp><swrl:body rdf:parseType=\"Collection\">#{GRel::QL.to_rules(body,context)}</swrl:body ><swrl:head rdf:parseType=\"Collection\">#{GRel::QL.to_rules(head,context)}</swrl:head></swrl:Imp>"
    end.join("")
    doc = "<rdf:RDF xml:base=\"#{GRel::NAMESPACE}\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:owl=\"http://www.w3.org/2002/07/owl#\" xmlns:swrl=\"http://www.w3.org/2003/11/swrl#\" xmlns:ruleml=\"http://www.w3.org/2003/11/swrl\">"
    doc += context.values.join("")
    doc += rules
    doc + "</rdf:RDF>"
  else
    raise Exception.new("Unkown rule axiom #{obj.inspect}")        
  end
end

.to_triples(obj) ⇒ Object



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
# File 'lib/grel/ql.rb', line 141

def self.to_triples(obj)
  if(obj.is_a?(BlankId))
    obj.to_s
  elsif(obj.is_a?(Symbol))
    if(obj == :@type)
      "rdf:type"
    elsif(obj == :@subclass)
      "rdfs:subClassOf"
    elsif(obj == :@subproperty)
      "rdfs:subPropertyOf"
    elsif(obj == :@domain)
      "rdfs:domain"
    elsif(obj == :@range)
      "rdfs:range"
    elsif(obj == :@same_as)
      "<http://www.w3.org/2002/07/owl#sameAs>"
    elsif(obj == :@functional)
      "<http://www.w3.org/2002/07/owl#FunctionalProperty>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#FunctionalProperty>")
      "<http://www.w3.org/2002/07/owl#FunctionalProperty>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#sameAs>")
      "<http://www.w3.org/2002/07/owl#sameAs>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#onClass>")
      "<http://www.w3.org/2002/07/owl#onClass>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#qualifiedCardinality>")
      "<http://www.w3.org/2002/07/owl#qualifiedCardinality>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#minCardinality>")
      "<http://www.w3.org/2002/07/owl#minCardinality>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#maxCardinality>")
      "<http://www.w3.org/2002/07/owl#maxCardinality>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#minQualifiedCardinality>")
      "<http://www.w3.org/2002/07/owl#minQualifiedCardinality>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#maxQualifiedCardinality>")
      "<http://www.w3.org/2002/07/owl#maxQualifiedCardinality>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#cardinality>")
      "<http://www.w3.org/2002/07/owl#cardinality>"
    elsif(obj == :@some)
      "<http://www.w3.org/2002/07/owl#someValuesFrom>"
    elsif(obj == :@all)
      "<http://www.w3.org/2002/07/owl#allValuesFrom>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#Restriction>")
      "<http://www.w3.org/2002/07/owl#Restriction>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#onProperty>")
      "<http://www.w3.org/2002/07/owl#onProperty>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#DatatypeProperty>")
      "<http://www.w3.org/2002/07/owl#DatatypeProperty>"
    elsif(obj == :"<http://www.w3.org/2002/07/owl#ObjectProperty>")
      "<http://www.w3.org/2002/07/owl#ObjectProperty>"
    else
      ":#{obj}"
    end
  elsif(obj.is_a?(String))
    if(obj =~ ID_REGEX)
      QL.to_id(obj)
    else
      "\"#{obj}\""
    end
  elsif(obj == nil)
    NIL
  elsif(obj == Float)
    "<http://www.w3.org/2001/XMLSchema#float>"
  elsif(obj == Numeric || obj == Fixnum || obj == "Bignum")
    "<http://www.w3.org/2001/XMLSchema#integer>"
  elsif(obj == Time || obj == Date || obj == DateTime)
    "<http://www.w3.org/2001/XMLSchema#dateTime>"
  elsif(obj == TrueClass || obj == FalseClass)
    "<http://www.w3.org/2001/XMLSchema#boolean>"
  elsif(obj.is_a?(NonNegativeInteger))
    obj.to_s
  elsif(obj == true || obj == false)
    "\"#{obj}\"^^<http://www.w3.org/2001/XMLSchema#boolean>"
  elsif(obj.is_a?(Float))
    "\"#{obj}\"^^<http://www.w3.org/2001/XMLSchema#float>"
  elsif(obj.is_a?(Numeric))
    "\"#{obj}\"^^<http://www.w3.org/2001/XMLSchema#integer>"
  elsif(obj.is_a?(Time))
    "\"#{obj.iso8601}\"^^<http://www.w3.org/2001/XMLSchema#dateTime>"
  elsif(obj.is_a?(Date))
    "\"#{Time.new(obj.to_s).iso8601}\"^^<http://www.w3.org/2001/XMLSchema#dateTime>"
  elsif(obj.is_a?(Array)) # top level array, not array property in a hash
    if(obj.detect{|e| e.is_a?(Hash) || e.respond_to?(:to_triples) })
      obj.map{|e| QL.to_triples(e) }.inject([]){|a,i| a += i}
    else
      obj.each_slice(3).map do |s|
        s.map{|e| QL.to_triples(e) }
      end
    end
  elsif(obj.is_a?(Hash))
    # no blank nodes
    obj[:@id] = "@id(#{SecureRandom.hex})" if obj[:@id].nil?
    # normalising id values
    obj[:@id] = "@id(#{obj[:@id]})" if obj[:@id].index("@id(").nil?

    acum = []
    triples_acum = []
    triples_nested = []
    id = nil
    obj.each_pair do |k,v|
      p = QL.to_triples(k)
      if(v.is_a?(Hash))
        next_triples = QL.to_triples(v)
        triples_acum += next_triples
        v = next_triples.triples_id
        acum << [p,v] if v && k != :@id
      elsif(v.is_a?(Array)) # array as a property in a hash
        v.map{|o| QL.to_triples(o) }.each do |o|
          if(o.is_a?(Array) || o.respond_to?(:triples_id))
            acum << [p, o.triples_id]
            triples_nested += o
          else
            acum << [p, o]
          end
        end
      else
        if(k == :@id) 
          id = QL.to_triples(v)
        else
          v = QL.to_triples(v)
        end
        acum << [p,v] if v && k != :@id
      end
    end

    id = id || BlankId.new

    triples_acum = triples_acum + acum.map{|(p,o)| [id, p, o] } + triples_nested
    triples_acum.triples_id = id
    triples_acum
  else
    if(obj.respond_to?(:to_triples))
      obj.to_triples
    else
      "\"#{obj}\""
    end
  end
end

.to_turtle(obj, schema = false) ⇒ Object



134
135
136
137
138
139
# File 'lib/grel/ql.rb', line 134

def self.to_turtle(obj, schema=false)
  data = "@prefix : <http://grel.org/vocabulary#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . "
  data = data + "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . " if schema

  data + QL.to_triples(obj).map{|t| t.map(&:to_s).join(" ") }.join(" .\n ") + " ."
end


117
118
119
120
121
122
123
124
# File 'lib/grel/ql.rb', line 117

def self.unlink_sparql_query(ids)
  conditions = ids.map do |id|
    id = "@id(#{id})" if id && id.is_a?(String) && id.index("@id(").nil?        
    id = QL.to_query(id)
    "(?S = #{id} && isIRI(?O) && ?P != <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>) || ?O = #{id}"
  end
  "SELECT ?S ?P ?O WHERE { ?S ?P ?O . FILTER (#{conditions.join(' || ')}) } "
end