query.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import logging
  2. from flask import Blueprint, current_app, request, render_template, send_file
  3. from rdflib.plugin import PluginException
  4. from lakesuperior.env import env
  5. from lakesuperior.dictionaries.namespaces import ns_mgr as nsm
  6. from lakesuperior.api import query as query_api
  7. # Query endpoint. raw SPARQL queries exposing the underlying layout can be made
  8. # available. Also convenience methods that allow simple lookups based on simple
  9. # binary comparisons should be added. Binary lookups—maybe?
  10. # N.B All data sources are read-only for this endpoint.
  11. logger = logging.getLogger(__name__)
  12. rdfly = env.app_globals.rdfly
  13. query = Blueprint('query', __name__)
  14. @query.route('/term_search', methods=['GET'])
  15. def term_search():
  16. '''
  17. Search by entering a search term and optional property and comparison term.
  18. '''
  19. valid_operands = (
  20. ('=', 'Equals'),
  21. ('>', 'Greater Than'),
  22. ('<', 'Less Than'),
  23. ('<>', 'Not Equal'),
  24. ('a', 'RDF Type'),
  25. )
  26. term = request.args.get('term')
  27. prop = request.args.get('prop', default=1)
  28. cmp = request.args.get('cmp', default='=')
  29. return render_template('term_search.html')
  30. @query.route('/sparql', methods=['GET', 'POST'])
  31. def sparql():
  32. '''
  33. Perform a direct SPARQL query on the underlying triplestore.
  34. @param qry SPARQL query string.
  35. '''
  36. accept_mimetypes = {
  37. 'text/csv': 'csv',
  38. 'application/sparql-results+json': 'json',
  39. 'application/sparql-results+xml': 'xml',
  40. }
  41. if request.method == 'GET':
  42. return render_template('sparql_query.html', nsm=nsm)
  43. else:
  44. if request.mimetype == 'application/sparql-query':
  45. qstr = request.stream.read()
  46. else:
  47. qstr = request.form['query']
  48. logger.debug('Query: {}'.format(qstr))
  49. match = request.accept_mimetypes.best_match(accept_mimetypes.keys())
  50. fmt = (
  51. accept_mimetypes[match] if match
  52. else request.accept_mimetypes.best)
  53. try:
  54. out_stream = query_api.sparql_query(qstr, fmt)
  55. except PluginException:
  56. return (
  57. 'Unable to serialize results into format {}'.format(fmt), 406)
  58. return send_file(out_stream, mimetype=fmt), 200