cgkb
Version:
Contextual Graph Knowledge Base
60 lines (53 loc) • 1.47 kB
JavaScript
const co = require('co')
const _ = require('lodash')
const path = require('path')
const kb = require(path.join(__dirname, 'kb'))
const nlp = require(path.join(__dirname, 'nlp'))
const nlpServer = require(path.join(__dirname, 'nlp-server'))
// the root node for the graph
var rootNode = {
word: "ROOT",
POS_fine: "ROOT",
POS_coarse: "ROOT"
}
// set name for visualization, and label
function setNameAndLabel(node) {
node['name'] = node['word']
node['label'] = node['POS_coarse'] == 'PUNCT' ? 'PUNCT' : node['POS_fine'] // words only
return node
}
function makeEdge(nodeTo) {
edge = { label: nodeTo['arc'] }
return edge
}
// format the nlp parse tree to graph
function parseTreeToGraph(parseTree, nodeFrom = rootNode, graph = []) {
setNameAndLabel(nodeFrom)
_.each(parseTree, (nodeTo) => {
// take out modifiers
var modifiers = _.get(nodeTo, 'modifiers')
_.unset(nodeTo, 'modifiers')
setNameAndLabel(nodeTo)
edge = makeEdge(nodeTo)
graph.push([nodeFrom, nodeTo, edge])
parseTreeToGraph(modifiers, nodeTo, graph)
})
return graph
}
// add knowledge to kb
var add = co.wrap(function*(text) {
var outputs = yield nlp.parse(text)
queries = _.flatMap(outputs, (o) => {
parseTree = o.parse_tree
graph = parseTreeToGraph(parseTree, rootNode)
qp = kb.addGraph(graph)
return qp
})
return yield kb.db.cypherAsync(queries)
})
module.exports = {
kb: kb,
nlp: nlp,
nlpServer: nlpServer,
add: add
}