HACK  server not~> db  <-  hide import within function
docs
query for constant nodes

write to database by command line

TEST
./command_line.py -w "sky : blue"
./command_line.py --get "sky : blue"
./command_line.py --get "sky : _"
./command_line.py --get "sky : red"

shift+enter doesn't input enter (by `event.preventDefault()`)

in `query.get`, hoist code block into function
.
`query` reads db  .  `store` writes db

the schema lives in these two "DB I/O" files,
schema changes must be consistent.

refactor `Graph.save_edge()` to `store.edge()`

store : Edge => ()

query : [Edge] => [[Edge]]

Line
line : dict  ->  cast by kwarg

`with db.testing()`
unittesting contextmanager for database

Edge(**_) : mongo edge => python edge

_.json : python edge => mongo edge
fix. give filename to `notes.read()`
refactor  to  . refactor  var to  var
querying (stub)

server.py
query API

visualization.js
no submit button, only submit keychord
client calls `/query`
refactor `.show` to `.query`

shift+enter in query box calls query
shift+enter in notes box parses notes

make new Edge with Line rather than mutating old Edge
editing writes DB . querying reads DB

`/draw` API writes notes to DB

move javascript libraries to `lib/`
new collection per connection (in cookie)

each client session gets own collection
collection named in cookie
if the collection is not in the database (or if no cookie is sent), make one
responds with a new (or the old) cookie collection
queries and results!

`Edge.format()` for showing an edge as a line (i.e. with the syntax)

visualization.css
add results bar on left

`logic_edge_to_visual_link()`
link : {'source', 'name', 'target', 'lineno', 'show'}

visualization.js
put `link.show` text in query bar
notes on left, tab to query in center, tab to results on right

tab follows order in `.html`