| Module | TripleManager |
| In: |
lib/semantic_record/triple_manager.rb
|
# File lib/semantic_record/triple_manager.rb, line 122
122: def self.add(subject,predicate,object,context=nil)
123: s,p,o = build(subject,predicate,object)
124: @@transit_model.add(s,p,o,context)
125: end
# File lib/semantic_record/triple_manager.rb, line 58
58: def self.attribute(uri)
59: @@transit_model.get_resource(uri)
60: end
# File lib/semantic_record/triple_manager.rb, line 140
140: def self.count
141: @@transit_model.size
142: end
# File lib/semantic_record/triple_manager.rb, line 8
8: def self.describe(uri)
9: unless exists_as_subject?(uri)
10: count = @@transit_model.size
11: populate_model_with_result( "CONSTRUCT {<#{uri}> ?p ?o} WHERE {<#{uri}> ?p ?o}" )
12: populate_model_with_result_from_http(uri)
13: # if count == @@transit_model.size
14: # puts "pop for #{uri}"
15:
16: # end
17: end
18: end
# File lib/semantic_record/triple_manager.rb, line 144
144: def self.exists_as_subject?(uri)
145: query = Redland::Query.new("SELECT ?result WHERE {<#{uri}> ?property ?result} LIMIT 1")
146: result = @@transit_model.query_execute(query).size
147: result > 0 ? true : false
148: end
# File lib/semantic_record/triple_manager.rb, line 71
71: def self.get_by_sparql(query_string,with_population=false)
72: query = Redland::Query.new(query_string)
73: result = @@transit_model.query_execute(query)
74:
75: if result.size == 0
76: parser = SparqlParser.new
77: query_object = parser.parse(query_string)
78: bindings = "#{query_object.query_part.bindings} ?p ?o"
79: where_clause = query_object.query_part.where.group_graph_pattern.text_value.insert(1,"#{bindings}.")
80:
81: construct_query = "CONSTRUCT {#{bindings}} WHERE #{where_clause} "
82:
83: populate_model_with_result(construct_query)
84: end
85: query = Redland::Query.new(query_string)
86: result = @@transit_model.query_execute(query)
87:
88:
89: returning [] do |res|
90: while !result.finished?
91: value = result.binding_value_by_name("result")
92: if value.resource?
93: res << SemanticRecord::Base.new(value.uri.to_s)
94: else
95: res << value.to_s
96: end
97: result.next
98: end
99: end
100: end
# File lib/semantic_record/triple_manager.rb, line 107
107: def self.get_objects(subject,predicate,*args)
108:
109: unless args.empty?
110: filter = "FILTER ( lang(?result) = '#{args[0][:lang]}' )"
111: else
112: filter = nil
113: end
114:
115: query_string = "SELECT ?result WHERE {<#{subject}> <#{predicate}> ?result #{filter} }"
116:
117: puts query_string
118:
119: get_by_sparql(query_string)
120: end
# File lib/semantic_record/triple_manager.rb, line 102
102: def self.get_subjects(s)
103: query_string = "SELECT ?result WHERE {?result <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> #{s}}"
104: get_by_sparql(query_string,false)
105: end
# File lib/semantic_record/triple_manager.rb, line 62
62: def self.populate_model_with_result(query)
63: q = query
64: parser = Redland::Parser.new
65: SemanticRecord::Pool.connections.each do |connection|
66: content = connection.socket.query(q,:result_type => RubySesame::DATA_TYPES[:RDFXML],:infer => true )
67: parser.parse_string_into_model(@@transit_model,content,Redland::Uri.new( "http://example.org/" ))
68: end
69: end
# File lib/semantic_record/triple_manager.rb, line 40
40: def self.populate_model_with_result_from_http(uri)
41: curl = Curl::Easy.new(uri)
42: curl.headers["Accept"] = "application/rdf+xml"
43: curl.follow_location = true
44: curl.connect_timeout = 2
45: curl.max_redirects = 5
46: begin
47: body = curl.perform
48: # only process responce if content-type matches
49: if !!(curl.content_type =~ /application\/rdf\+xml/)
50: parser = Redland::Parser.new
51: parser.parse_string_into_model(@@transit_model,curl.body_str,Redland::Uri.new( uri ))
52: end
53: rescue
54:
55: end
56: end
# File lib/semantic_record/triple_manager.rb, line 34
34: def self.properties_for(s)
35: query_string = "SELECT ?result WHERE {<#{s}> ?result ?object}"
36:
37: get_by_sparql(query_string)
38: end
# File lib/semantic_record/triple_manager.rb, line 20
20: def self.property_for(s,p)
21: unless exists_as_subject?( p )
22: populate_model_with_result_from_http( p )
23: end
24:
25: resource = @@transit_model.get_resource( Redland::Uri.new(p) )
26: value = get_objects(s,p)
27:
28: return {:value => value,
29: :range => resource.try(:get_property, Redland::Uri.new("http://www.w3.org/2000/01/rdf-schema#range") ),
30: :domain => resource.try(:get_property, Redland::Uri.new("http://www.w3.org/2000/01/rdf-schema#domain") )
31: }
32: end
# File lib/semantic_record/triple_manager.rb, line 127
127: def self.update(subject,attributes)
128: attributes.each do |predicate,objects|
129: sub,pre = build(subject,predicate,nil)
130: @@transit_model.find(sub,pre).each do |removable_statement|
131: @@transit_model.delete_statement(removable_statement)
132: end
133: objects.each do |object|
134: s,p,o = build(subject,predicate,object)
135: @@transit_model.add(s,p,o)
136: end
137: end
138: end
# File lib/semantic_record/triple_manager.rb, line 152
152: def self.build(subject,predicate,object)
153: s = Redland::Resource.new( subject )
154: p = Redland::Resource.new( predicate )
155:
156: if object.kind_of?(SemanticRecord) || (object.kind_of?(Class) && object.respond_to?(:uri) )
157: o = Redland::Resource.new( object.uri )
158: else
159: o = object.to_s
160: end
161:
162: return s,p,o
163: end