lib/rbbt/rest/knowledge_base.rb in rbbt-rest-1.3.26 vs lib/rbbt/rest/knowledge_base.rb in rbbt-rest-1.3.27
- old
+ new
@@ -9,10 +9,12 @@
module RbbtRESTKnowledgeBase
def self.registered(base)
base.module_eval do
helpers KnowledgeBaseRESTHelpers
+ #{{{ Single entity
+
get '/knowledge_base/:name/:database/children/:entity' do
name = consume_parameter :name
database = consume_parameter :database
entity = consume_parameter :entity
@@ -78,9 +80,159 @@
content_type :text
neighs = []
neighs.concat neighbours[:parents].source if neighbours[:parents]
neighs.concat neighbours[:children].target
halt 200, neighs * "\n"
+ end
+ end
+
+ get '/knowledge_base/:name/:database/subset' do
+ name = consume_parameter :name
+ database = consume_parameter :database
+ source = consume_parameter :source
+ target = consume_parameter :target
+
+ source = source == "all" ? :all : source.split(@array_separator) if source
+ target = target == "all" ? :all : target.split(@array_separator) if target
+ entities = { :source => source, :target => target }
+
+ kb = get_knowledge_base name
+ subset = kb.subset(database, entities)
+ case @format
+ when :tsv
+ content_type "text/tab-separated-values"
+ halt 200, subset.tsv.to_s
+ when :html
+ template_render('knowledge_base_partials/subset', {:subset => subset}, "Subset: #{ [name, database] }")
+ when :json
+ content_type :json
+ halt 200, subset.source.to_json
+ else
+ content_type :text
+ halt 200, subset.source * "\n"
+ end
+ end
+
+
+ #{{{ Collection
+
+ post '/knowledge_base/:name/:database/collection_children' do
+ name = consume_parameter :name
+ database = consume_parameter :database
+ collection = consume_parameter :collection
+ raise ParameterException, "No collection specified" if collection.nil?
+ collection = JSON.parse(collection)
+
+ kb = get_knowledge_base name
+ matches = collection.keys.inject({}){|acc,type|
+ entities = collection[type]
+ entities.each do |entity|
+ _matches = kb.children(database, entity)
+ acc.merge!({ _matches.target_type => _matches}) if _matches and _matches.any?
+ end
+ acc
+ }
+ case @format
+ when :tsv
+ content_type "text/tab-separated-values"
+ matches = matches.sort_by{|k,list| list.length }.last.last
+ halt 200, matches.tsv.to_s
+ when :html
+ template_render('knowledge_base_partials/matches', {:matches => matches}, "Collection Children: #{ [name, database] }")
+ when :json
+ content_type :json
+ _matches = {}
+ matches.each{|type,list|
+ _matches[type] = list.target
+ }
+ halt 200, _matches.to_json
+ else
+ content_type :text
+ matches = matches.sort_by{|k,list| list.length }.last.last
+ halt 200, matches.target * "\n"
+ end
+ end
+
+ post '/knowledge_base/:name/:database/collection_parents' do
+ name = consume_parameter :name
+ database = consume_parameter :database
+ collection = consume_parameter :collection
+ raise ParameterException, "No collection specified" if collection.nil?
+ collection = JSON.parse(collection)
+
+ kb = get_knowledge_base name
+ matches = collection.keys.inject({}){|acc,type|
+ entities = collection[type]
+ entities.each do |entity|
+ _matches = kb.parents(database, entity)
+ acc.merge!({ _matches.target_type => _matches}) if _matches and _matches.any?
+ end
+ acc
+ }
+ case @format
+ when :tsv
+ content_type "text/tab-separated-values"
+ matches = matches.sort_by{|k,list| list.length }.last.last
+ halt 200, matches.tsv.to_s
+ when :html
+ template_render('knowledge_base_partials/matches', {:matches => matches}, "Collection Parents: #{ [name, database] }")
+ when :json
+ content_type :json
+ _matches = {}
+ matches.each{|type,list|
+ _matches[type] = list.target
+ }
+ halt 200, _matches.to_json
+ else
+ content_type :text
+ matches = matches.sort_by{|k,list| list.length }.last.last
+ halt 200, matches.target * "\n"
+ end
+ end
+
+ post '/knowledge_base/:name/:database/collection_neighbours' do
+ name = consume_parameter :name
+ database = consume_parameter :database
+ collection = consume_parameter :collection
+ raise ParameterException, "No collection specified" if collection.nil?
+ collection = JSON.parse(collection)
+
+ kb = get_knowledge_base name
+ matches = collection.keys.inject({}){|acc,type|
+ entities = collection[type]
+ entities.each do |entity|
+ _matches_h = kb.neighbours(database, entity)
+ _matches_h.each do |key, _matches|
+ target_type = case key
+ when :children
+ _matches.target_type
+ when :parents
+ _matches.source_type
+ end
+ _matches = acc[target_type].concat _matches if acc[target_type] and acc[target_type].any?
+ acc.merge!({ target_type => _matches}) if _matches and _matches.any?
+ end
+ end
+ acc
+ }
+ case @format
+ when :tsv
+ content_type "text/tab-separated-values"
+ matches = matches.sort_by{|k,list| list.length }.last.last
+ halt 200, matches.tsv.to_s
+ when :html
+ template_render('knowledge_base_partials/matches', {:matches => matches}, "Collection Parents: #{ [name, database] }")
+ when :json
+ content_type :json
+ _matches = {}
+ matches.each{|type,list|
+ _matches[type] = list.target
+ }
+ halt 200, _matches.to_json
+ else
+ content_type :text
+ matches = matches.sort_by{|k,list| list.length }.last.last
+ halt 200, matches.target * "\n"
end
end
get '/knowledge_base/:name/:database/subset' do
name = consume_parameter :name