knowledgeBase - MongoDB.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. //© 2019 Dublin City University, Trinity College Dublin. All rights reserved. This material may not be reproduced, displayed, modified or distributed without the express prior written permission of the copyright holder.
  2. var path = require('path');
  3. var fs = require('fs');
  4. const knowledgeBaseFile = __dirname + '/output';
  5. const statusFile = __dirname + '/status/statusStore.json';
  6. const axios = require('axios');
  7. const queryString = require('query-string');
  8. const knowledgeBaseModel = require(__dirname + '/model/knowledgeBaseModel.js');
  9. var Promise = require('promise');
  10. const headers = { 'Accept': 'application/sparql-results+json', 'Content-Type': 'application/x-www-form-urlencoded' };
  11. const UndefinedClassesAndPropertiesMetricQuery = require(__dirname + '/sparql/UndefinedClassesAndPropertiesMetric');
  12. const HumanReadableLabellingMetricQuery = require(__dirname + '/sparql/HumanReadableLabellingMetric');
  13. const CompatibleDatatypeQuery = require(__dirname + '/sparql/CompatibleDatatype');
  14. const EntitiesAsMembersOfDisjointClassesMetricQuery = require(__dirname + '/sparql/EntitiesAsMembersOfDisjointClassesMetric');
  15. const MisplacedClassesOrPropertiesMetricQuery = require(__dirname + '/sparql/MisplacedClassesOrPropertiesMetric');
  16. const MisusedOwlDatatypeOrObjectPropertiesMetricQuery = require(__dirname + '/sparql/MisusedOwlDatatypeOrObjectPropertiesMetric');
  17. const UsageOfIncorrectDomainOrRangeDatatypesMetricQuery = require(__dirname + '/sparql/UsageOfIncorrectDomainOrRangeDatatypesMetric');
  18. const ExtensionalConcisenessMetricQuery_FetchProblem = require(__dirname + '/sparql/ExtensionalConcisenessMetric_FetchProblem');
  19. const ExtensionalConcisenessMetricQuery_FetchAllTriples = require(__dirname + '/sparql/ExtensionalConcisenessMetric_FetchAllTriples');
  20. const ExtensionalConcisenessMetricQuery_FindRelated = require(__dirname + '/sparql/ExtensionalConcisenessMetric_FindRelated');
  21. class knowledgeBases {
  22. getKnowledgeBaseMongoDBStatus(req, res){
  23. return res.status(200).send({
  24. status: 'OK'
  25. });
  26. }
  27. getKnowledgeBase(req, res) {
  28. const fs = require('fs');
  29. let rawdata = fs.readFileSync(statusFile);
  30. let knowledgeBases = JSON.parse(rawdata);
  31. const knowledgeBaseID = parseInt(req.query.knowledgeBaseID, 10);
  32. let knowledgeBaseIndex;
  33. let knowledgeBaseStatus = "";
  34. knowledgeBases["knowledgeBases"].map((knowledgeBase, index) => {
  35. if (knowledgeBase.knowledgeBaseID === knowledgeBaseID) {
  36. knowledgeBaseIndex = index;
  37. knowledgeBaseStatus = knowledgeBase.status;
  38. }
  39. });
  40. if (knowledgeBaseIndex >= 0 & knowledgeBaseStatus === "COMPLETED") {
  41. knowledgeBaseModel.find({ knowledgeBaseID: knowledgeBases["knowledgeBases"][knowledgeBaseIndex].knowledgeBaseID }).then(function (knowledgeBaseDocument) {
  42. if (!knowledgeBaseDocument) {
  43. return res.status(404).send({
  44. status: 'false',
  45. message: 'Knowledge Base not Created',
  46. });
  47. }
  48. return res.status(200).send(
  49. knowledgeBaseDocument
  50. );
  51. }).catch(function (err) {
  52. return res.status(404).send({
  53. status: 'false',
  54. message: 'Knowledge Base not Created',
  55. });
  56. });
  57. }
  58. else {
  59. return res.status(404).send({
  60. status: 'false',
  61. message: 'Knowledge Base not Created',
  62. });
  63. }
  64. }
  65. findKnowledgeBaseDocumentIDs(req, res) {
  66. const fs = require('fs');
  67. let rawdata = fs.readFileSync(statusFile);
  68. let knowledgeBases = JSON.parse(rawdata);
  69. const knowledgeBaseID = parseInt(req.query.knowledgeBaseID, 10);
  70. let knowledgeBaseIndex;
  71. let knowledgeBaseStatus = "";
  72. knowledgeBases["knowledgeBases"].map((knowledgeBase, index) => {
  73. if (knowledgeBase.knowledgeBaseID === knowledgeBaseID) {
  74. knowledgeBaseIndex = index;
  75. knowledgeBaseStatus = knowledgeBase.status;
  76. }
  77. });
  78. if (knowledgeBaseIndex >= 0 & knowledgeBaseStatus === "COMPLETED") {
  79. knowledgeBaseModel.find({ knowledgeBaseID: knowledgeBases["knowledgeBases"][knowledgeBaseIndex].knowledgeBaseID }, '_id').then(function (knowledgeBaseDocument) {
  80. if (!knowledgeBaseDocument) {
  81. return res.status(404).send({
  82. status: 'false',
  83. message: 'No Knowledge Base Documents Available',
  84. });
  85. }
  86. return res.status(200).send(
  87. knowledgeBaseDocument
  88. );
  89. }).catch(function (err) {
  90. return res.status(404).send({
  91. status: 'false',
  92. message: 'No Knowledge Base Documents Available',
  93. });
  94. });
  95. }
  96. else {
  97. return res.status(404).send({
  98. status: 'false',
  99. message: 'No Knowledge Base Documents Available',
  100. });
  101. }
  102. }
  103. getKnowledgeBaseStatus(req, res) {
  104. const fs = require('fs');
  105. let rawdata = fs.readFileSync(statusFile);
  106. let knowledgeBases = JSON.parse(rawdata);
  107. const knowledgeBaseID = parseInt(req.query.knowledgeBaseID, 10);
  108. let knowledgeBaseIndex;
  109. knowledgeBases["knowledgeBases"].map((knowledgeBase, index) => {
  110. if (knowledgeBase.knowledgeBaseID === knowledgeBaseID) {
  111. knowledgeBaseIndex = index;
  112. }
  113. });
  114. if (knowledgeBaseIndex >= 0) {
  115. return res.status(200).send(
  116. knowledgeBases["knowledgeBases"][knowledgeBaseIndex]
  117. );
  118. }
  119. else {
  120. return res.status(404).send({
  121. status: 'false',
  122. message: 'Knowledge Base Not Found',
  123. });
  124. }
  125. }
  126. generateKnowledgeBase(req, res) {
  127. const fs = require('fs');
  128. const metrics = req.body.metrics;
  129. let rawdata = fs.readFileSync(statusFile);
  130. let knowledgeBase = JSON.parse(rawdata);
  131. //const metrics = JSON.parse(req.body.metrics);
  132. const qualityGraph = req.body.qualityGraph;
  133. const dataGraph = req.body.dataGraph;
  134. const tripleStoreEndPoint = req.body.tripleStoreEndPoint;
  135. const isSparqlEndPoint = req.body.isSparqlEndPoint;
  136. const lastAssessmentDate = req.body.lastAssessmentDate;
  137. let queryResults = [];
  138. let output = ''
  139. let knowledgeBaseID = Math.floor(Date.now());
  140. const knowledgeBaseNew = {
  141. knowledgeBaseID: knowledgeBaseID,
  142. status: "INPROGRESS",
  143. lastAssessmentDate: lastAssessmentDate
  144. };
  145. function setImmediatePromise() {
  146. return new Promise((resolve) => {
  147. setImmediate(() => resolve());
  148. });
  149. }
  150. knowledgeBase["knowledgeBases"].push(knowledgeBaseNew);
  151. let updatedKnowledgeBase = JSON.stringify(knowledgeBase, null, 2);
  152. fs.writeFile(statusFile, updatedKnowledgeBase, function (error) {
  153. if (error) {
  154. //console.log('error writing file: ' + err);
  155. return res.status(500).send(
  156. {
  157. knowledgeBaseID: knowledgeBaseID,
  158. status: "FAILED"
  159. });
  160. }
  161. console.log("Metrics : "+metrics.length);
  162. var buildResultArray = function (query) {
  163. return new Promise(function (resolve, reject) {
  164. axios.post(tripleStoreEndPoint, queryString.stringify({ query: query }), headers)
  165. .then(response => {
  166. if (response) {
  167. if (response.status === 200) {
  168. console.log("buildResultArray : "+response.data.results.bindings.length);
  169. response.data.results.bindings.forEach(function (binding) {
  170. let ProblematicThing = "";
  171. let Subject = "";
  172. let Predicate = "";
  173. let Object = "";
  174. let FailedMertic = "";
  175. let Exception = "";
  176. if (binding.ProblematicThing !== undefined) {
  177. ProblematicThing = binding.ProblematicThing.value;
  178. }
  179. if (binding.Subject !== undefined) {
  180. Subject = "<"+binding.Subject.value+">";
  181. }
  182. if (binding.Predicate !== undefined) {
  183. Predicate = "<"+binding.Predicate.value+">";
  184. }
  185. if (binding.Object !== undefined) {
  186. if(binding.Object.type==="uri")
  187. {
  188. Object +="<"+binding.Object.value+">";
  189. }
  190. else
  191. {
  192. if(binding.Object["xml:lang"]!==undefined)
  193. {
  194. Object +="\"\"\""+binding.Object.value+"\"\"\"@" +binding.Object["xml:lang"];
  195. }
  196. else if(binding.Object["datatype"]!==undefined)
  197. {
  198. let value = binding.Object.value.replace(/(\"|\')/g, '\\$1');
  199. Object +="\"\"\""+value+"\"\"\""+"^^<" +binding.Object["datatype"]+">" ;
  200. }
  201. else{
  202. Object +="\"\"\""+binding.Object.value+"\"\"\"";
  203. }
  204. }
  205. }
  206. if (binding.FailedMertic !== undefined) {
  207. //FailedMertic = binding.FailedMertic.value;
  208. FailedMertic = binding.FailedMertic.value.split("#")[1];
  209. }
  210. if (binding.Exception !== undefined) {
  211. //Exception = binding.Exception.value;
  212. Exception = binding.Exception.value.split("#")[1];
  213. }
  214. let temp = {
  215. "ProblematicThing": ProblematicThing,
  216. "Subject": Subject,
  217. "Predicate": Predicate,
  218. "Object": Object,
  219. "FailedMertic": FailedMertic,
  220. "Exception": Exception
  221. }
  222. queryResults.push(temp);
  223. });
  224. }
  225. }
  226. resolve();
  227. })
  228. .catch(error => {
  229. reject(error);
  230. });
  231. });
  232. }
  233. var buildextensionalConcisenessMetricProblems = function (query) {
  234. return new Promise(function (resolve, reject) {
  235. let queryResultsTemp=[];
  236. axios.post(tripleStoreEndPoint, queryString.stringify({ query: query }), headers)
  237. .then(response => {
  238. if (response) {
  239. if (response.status === 200) {
  240. console.log("buildextensionalConcisenessMetricProblems : "+response.data.results.bindings.length);
  241. response.data.results.bindings.forEach(function (binding) {
  242. let ProblematicThing = "";
  243. let Subject = "";
  244. let Predicate = "";
  245. let Object = "";
  246. let FailedMertic = "";
  247. let Exception = "";
  248. if (binding.ProblematicThing !== undefined) {
  249. ProblematicThing = binding.ProblematicThing.value;
  250. }
  251. if (binding.Subject !== undefined) {
  252. Subject = "<"+binding.Subject.value+">";
  253. }
  254. if (binding.Predicate !== undefined) {
  255. Predicate = "<"+binding.Predicate.value+">";
  256. }
  257. if (binding.FailedMertic !== undefined) {
  258. //FailedMertic = binding.FailedMertic.value;
  259. FailedMertic = binding.FailedMertic.value.split("#")[1];
  260. }
  261. if (binding.Exception !== undefined) {
  262. //Exception = binding.Exception.value;
  263. Exception = binding.Exception.value.split("#")[1];
  264. }
  265. let temp = {
  266. "ProblematicThing": ProblematicThing,
  267. "Subject": Subject,
  268. "Predicate": Predicate,
  269. "Object": Object,
  270. "FailedMertic": FailedMertic,
  271. "Exception": Exception
  272. }
  273. queryResultsTemp.push(temp);
  274. });
  275. }
  276. }
  277. resolve(queryResultsTemp);
  278. })
  279. .catch(error => {
  280. //reject(queryResultsTemp);
  281. resolve(queryResultsTemp);
  282. });
  283. });
  284. }
  285. var buildextensionalConcisenessAllTripleQuery = function (query) {
  286. return new Promise(function (resolve, reject) {
  287. let triples="";
  288. axios.post(tripleStoreEndPoint, queryString.stringify({ query: query }), headers)
  289. .then(response => {
  290. if (response) {
  291. if (response.status === 200) {
  292. console.log("buildextensionalConcisenessAllTripleQuery : "+response.data.results.bindings.length);
  293. let length=response.data.results.bindings.length;
  294. response.data.results.bindings.forEach(function (binding,index)
  295. {
  296. if(index===0)
  297. {
  298. triples="?Resource ";
  299. }
  300. triples +="<"+binding.Predicate.value+"> ";
  301. if(binding.Object.type==="uri")
  302. {
  303. triples +="<"+binding.Object.value+"> ";
  304. }
  305. else
  306. {
  307. if(binding.Object["xml:lang"]!==undefined)
  308. {
  309. triples +="\"\"\""+binding.Object.value+"\"\"\"@" +binding.Object["xml:lang"]+" " ;
  310. }
  311. else if(binding.Object["datatype"]!==undefined)
  312. {
  313. let value = binding.Object.value.replace(/(\"|\')/g, '\\$1');
  314. //triples += "\"s\" ";
  315. triples +="\"\"\""+value+"\"\"\""+"^^<" +binding.Object["datatype"]+"> " ;
  316. }
  317. else{
  318. triples +="\"\"\""+binding.Object.value+"\"\"\" ";
  319. }
  320. }
  321. if(!(index===length-1))
  322. {
  323. triples += "; ";
  324. }
  325. });
  326. }
  327. }
  328. resolve(triples);
  329. })
  330. .catch(error => {
  331. //reject(triples);
  332. resolve(triples);
  333. });
  334. });
  335. }
  336. var buildextensionalConcisenessResultArray = function (query) {
  337. return new Promise(function (resolve, reject) {
  338. let related=[];
  339. axios.post(tripleStoreEndPoint, queryString.stringify({ query: query }), headers)
  340. .then(response => {
  341. if (response) {
  342. if (response.status === 200) {
  343. console.log("buildextensionalConcisenessResultArray : "+response.data.results.bindings.length);
  344. let length=response.data.results.bindings.length;
  345. response.data.results.bindings.forEach(function (binding,index)
  346. {
  347. related.push(binding.Resource.value);
  348. });
  349. }
  350. }
  351. resolve(related);
  352. })
  353. .catch(error => {
  354. //reject(related);
  355. resolve(related);
  356. });
  357. });
  358. }
  359. var triggerActivity = async function () {
  360. for (const metric of metrics) {
  361. let query = "";
  362. switch (metric.metric) {
  363. case 'UndefinedClassesAndPropertiesMetric':
  364. console.log("UndefinedClassesAndPropertiesMetric");
  365. query = UndefinedClassesAndPropertiesMetricQuery.UndefinedClassesAndPropertiesMetric(qualityGraph, dataGraph, metric.observationURI);
  366. await buildResultArray(query);
  367. break;
  368. case 'HumanReadableLabellingMetric':
  369. console.log("HumanReadableLabellingMetric");
  370. query = HumanReadableLabellingMetricQuery.HumanReadableLabellingMetric(qualityGraph, dataGraph, metric.observationURI);
  371. await buildResultArray(query);
  372. break;
  373. case 'CompatibleDatatype':
  374. console.log("CompatibleDatatype");
  375. query = CompatibleDatatypeQuery.CompatibleDatatype(qualityGraph, dataGraph, metric.observationURI);
  376. await buildResultArray(query);
  377. break;
  378. case 'EntitiesAsMembersOfDisjointClassesMetric':
  379. console.log("EntitiesAsMembersOfDisjointClassesMetric");
  380. query = EntitiesAsMembersOfDisjointClassesMetricQuery.EntitiesAsMembersOfDisjointClassesMetric(qualityGraph, dataGraph, metric.observationURI);
  381. await buildResultArray(query);
  382. break;
  383. case 'MisplacedClassesOrPropertiesMetric':
  384. console.log("MisplacedClassesOrPropertiesMetric");
  385. query = MisplacedClassesOrPropertiesMetricQuery.MisplacedClassesOrPropertiesMetric(qualityGraph, dataGraph, metric.observationURI);
  386. await buildResultArray(query);
  387. break;
  388. case 'MisusedOwlDatatypeOrObjectPropertiesMetric':
  389. console.log("MisusedOwlDatatypeOrObjectPropertiesMetric");
  390. query = MisusedOwlDatatypeOrObjectPropertiesMetricQuery.MisusedOwlDatatypeOrObjectPropertiesMetric(qualityGraph, dataGraph, metric.observationURI);
  391. await buildResultArray(query);
  392. break;
  393. case 'UsageOfIncorrectDomainOrRangeDatatypesMetric':
  394. console.log("UsageOfIncorrectDomainOrRangeDatatypesMetric");
  395. query = UsageOfIncorrectDomainOrRangeDatatypesMetricQuery.UsageOfIncorrectDomainOrRangeDatatypesMetric(qualityGraph, dataGraph, metric.observationURI);
  396. await buildResultArray(query);
  397. break;
  398. case 'ExtensionalConcisenessMetric':
  399. console.log("ExtensionalConcisenessMetric");
  400. query = ExtensionalConcisenessMetricQuery_FetchProblem.ExtensionalConcisenessMetric(qualityGraph, dataGraph, metric.observationURI);
  401. let queryResultsTemp = await buildextensionalConcisenessMetricProblems(query);
  402. //console.log(queryResultsTemp);
  403. for(const problem of queryResultsTemp)
  404. {
  405. //console.log("PROBLEM : "+problem.Subject);
  406. let subject = problem.Subject;
  407. query = ExtensionalConcisenessMetricQuery_FetchAllTriples.ExtensionalConcisenessMetric(qualityGraph, dataGraph, subject);
  408. let triples = await buildextensionalConcisenessAllTripleQuery(query);
  409. //console.log(triples);
  410. let relatedResourcesQuery=ExtensionalConcisenessMetricQuery_FindRelated.ExtensionalConcisenessMetric(triples, dataGraph, subject);
  411. let relatedResources=await buildextensionalConcisenessResultArray(relatedResourcesQuery);
  412. //console.log(relatedResources);
  413. for(const related of relatedResources)
  414. {
  415. problem.Object=related;
  416. queryResults.push(problem);
  417. }
  418. }
  419. break;
  420. default:
  421. console.log("default");
  422. query = "";
  423. break;
  424. }
  425. }
  426. }
  427. triggerActivity().then(async function () {
  428. //Loop through each array object
  429. for (const [outerIndex, outerResult] of queryResults.entries()) {
  430. let SubjectRelatedExceptions = [];
  431. let PredicateRelatedExceptions = [];
  432. let ObjectRelatedExceptions = [];
  433. let SameTripleSameProblematicThingRelatedExceptions = [];
  434. let SameTripleDifferentProblematicThingRelatedExceptions = [];
  435. let tempArray = [];
  436. //console.log(outerIndex);
  437. //Add Await call to setImmediate to prevent thread blocking
  438. await setImmediatePromise()
  439. //Find SubjectRelatedExceptions
  440. tempArray = [];
  441. for (const [innerIndex, innerResult] of queryResults.entries()) {
  442. //Ignore same entry
  443. if (innerIndex !== outerIndex) {
  444. if (innerResult.ProblematicThing === "Subject" & outerResult.Subject === innerResult.Subject) {
  445. tempArray.push(innerResult.Exception);
  446. }
  447. }
  448. }
  449. SubjectRelatedExceptions = [...new Set(tempArray.map((exception) => (exception)))];
  450. queryResults[outerIndex].SubjectRelatedExceptions = [...SubjectRelatedExceptions];
  451. //Find PredicateRelatedExceptions
  452. tempArray = [];
  453. for (const [innerIndex, innerResult] of queryResults.entries()) {
  454. //Ignore same entry
  455. if (innerIndex !== outerIndex) {
  456. if (innerResult.ProblematicThing === "Predicate" & outerResult.Predicate === innerResult.Predicate) {
  457. tempArray.push(innerResult.Exception);
  458. }
  459. }
  460. }
  461. PredicateRelatedExceptions = [...new Set(tempArray.map((exception) => (exception)))];
  462. queryResults[outerIndex].PredicateRelatedExceptions = [...PredicateRelatedExceptions];
  463. //Find ObjectRelatedExceptions
  464. tempArray = [];
  465. for (const [innerIndex, innerResult] of queryResults.entries()) {
  466. //Ignore same entry
  467. if (innerIndex !== outerIndex) {
  468. if (innerResult.ProblematicThing === "Object" & outerResult.Object === innerResult.Object) {
  469. tempArray.push(innerResult.Exception);
  470. }
  471. }
  472. }
  473. ObjectRelatedExceptions = [...new Set(tempArray.map((exception) => (exception)))];
  474. queryResults[outerIndex].ObjectRelatedExceptions = [...ObjectRelatedExceptions];
  475. //Find SameTripleSameProblematicThingRelatedExceptions
  476. tempArray = [];
  477. for (const [innerIndex, innerResult] of queryResults.entries()) {
  478. //Ignore same entry
  479. if (innerIndex !== outerIndex) {
  480. if (innerResult.ProblematicThing === outerResult.ProblematicThing & outerResult.Subject === innerResult.Subject & outerResult.Precicate === innerResult.Precicate & outerResult.Object === innerResult.Object) {
  481. tempArray.push(innerResult.Exception);
  482. }
  483. }
  484. }
  485. SameTripleSameProblematicThingRelatedExceptions = [...new Set(tempArray.map((exception) => (exception)))];
  486. queryResults[outerIndex].SameTripleSameProblematicThingRelatedExceptions = [...SameTripleSameProblematicThingRelatedExceptions];
  487. //Find SameTripleDifferentProblematicThingRelatedExceptions
  488. tempArray = [];
  489. for (const [innerIndex, innerResult] of queryResults.entries()) {
  490. //Ignore same entry
  491. if (innerIndex !== outerIndex) {
  492. if (innerResult.ProblematicThing !== outerResult.ProblematicThing & outerResult.Subject === innerResult.Subject & outerResult.Precicate === innerResult.Precicate & outerResult.Object === innerResult.Object) {
  493. tempArray.push(innerResult.Exception);
  494. }
  495. }
  496. }
  497. SameTripleDifferentProblematicThingRelatedExceptions = [...new Set(tempArray.map((exception) => (exception)))];
  498. queryResults[outerIndex].SameTripleDifferentProblematicThingRelatedExceptions = [...SameTripleDifferentProblematicThingRelatedExceptions];
  499. queryResults[outerIndex].knowledgeBaseID = knowledgeBaseID;
  500. //Write to MongoDB
  501. //console.log(queryResults);
  502. let knowledgeBaseDocumentToSave = new knowledgeBaseModel(queryResults[outerIndex]);
  503. await knowledgeBaseDocumentToSave.save();
  504. }
  505. /*
  506. for (let row = 0; row < queryResults.length; row++) {
  507. let keysAmount = Object.keys(queryResults[row]).length
  508. let keysCounter = 0
  509. // If this is the first row, generate the headings
  510. if (row === 0) {
  511. // Loop each property of the object
  512. for (let key in queryResults[row]) {
  513. output += key + (keysCounter + 1 < keysAmount ? '\t' : '\r\n')
  514. keysCounter++
  515. }
  516. } else {
  517. for (let key in queryResults[row]) {
  518. output += queryResults[row][key] + (keysCounter + 1 < keysAmount ? '\t' : '\r\n')
  519. keysCounter++
  520. }
  521. }
  522. keysCounter = 0
  523. }
  524. */
  525. //console.log(output)
  526. //Write to File
  527. /* fs.writeFile(knowledgeBaseFile + '/formList.csv', output, 'utf8', function (err) {
  528. if (err) {
  529. //console.log('Some error occured - file either not saved or corrupted file saved.');
  530. } else {
  531. //console.log('It\'s saved!');
  532. }
  533. });
  534. */
  535. //Update Status as Completed
  536. rawdata = fs.readFileSync(statusFile);
  537. knowledgeBase = JSON.parse(rawdata);
  538. let knowledgeBaseIDIndex;
  539. knowledgeBase["knowledgeBases"].map((knowledgeBase, index) => {
  540. if (knowledgeBase.knowledgeBaseID === knowledgeBaseID) {
  541. knowledgeBaseIDIndex = index;
  542. }
  543. });
  544. knowledgeBase["knowledgeBases"][knowledgeBaseIDIndex].status = "COMPLETED";
  545. let updatedData = JSON.stringify(knowledgeBase, null, 2);
  546. fs.writeFileSync(statusFile, updatedData);
  547. }
  548. ).catch(function(error){
  549. rawdata = fs.readFileSync(statusFile);
  550. knowledgeBase = JSON.parse(rawdata);
  551. let knowledgeBaseIDIndex;
  552. knowledgeBase["knowledgeBases"].map((knowledgeBase, index) => {
  553. if (knowledgeBase.knowledgeBaseID === knowledgeBaseID) {
  554. knowledgeBaseIDIndex = index;
  555. }
  556. });
  557. knowledgeBase["knowledgeBases"][knowledgeBaseIDIndex].status = "FAILED";
  558. let updatedData = JSON.stringify(knowledgeBase, null, 2);
  559. fs.writeFileSync(statusFile, updatedData);
  560. });
  561. return res.status(201).send(knowledgeBaseNew);
  562. });
  563. }
  564. }
  565. const knowledgeBase = new knowledgeBases();
  566. export default knowledgeBase;