Mercurial > hg > ng2-query-ismi
comparison app/query.service.ts @ 41:5353b2dffb0f
added local configuration file app/app-config.ts.
author | casties |
---|---|
date | Mon, 15 Feb 2016 17:05:07 +0100 |
parents | 896ae7eefb33 |
children | dc4f0541f04d |
comparison
equal
deleted
inserted
replaced
40:896ae7eefb33 | 41:5353b2dffb0f |
---|---|
2 import {Http, Headers} from 'angular2/http'; | 2 import {Http, Headers} from 'angular2/http'; |
3 | 3 |
4 import 'rxjs/Rx'; // import all RxJS operators | 4 import 'rxjs/Rx'; // import all RxJS operators |
5 //import 'rxjs/add/operator/map'; | 5 //import 'rxjs/add/operator/map'; |
6 | 6 |
7 import {NEO4J_BASE_URL, NEO4J_AUTHENTICATION} from './app-config'; | |
7 import {QueryMode, QUERY_MODES, FIRST_QUERY_MODES} from './query-mode'; | 8 import {QueryMode, QUERY_MODES, FIRST_QUERY_MODES} from './query-mode'; |
8 import {QueryState} from './query-state'; | 9 import {QueryState} from './query-state'; |
9 import {QueryStep} from './query-step'; | 10 import {QueryStep} from './query-step'; |
10 import {getResultType} from './result-type'; | 11 import {getResultType} from './result-type'; |
11 import {ISMI_RESULT_TYPES} from './ismi-result-types'; | 12 import {ISMI_RESULT_TYPES} from './ismi-result-types'; |
12 import {getRelationType} from './ismi-relation-types'; | 13 import {getRelationType} from './ismi-relation-types'; |
13 | 14 |
14 @Injectable() | 15 @Injectable() |
15 export class QueryService { | 16 export class QueryService { |
16 | 17 |
17 //public neo4jBaseUrl = 'https://ismi-dev.mpiwg-berlin.mpg.de/neo4j-ismi/db/data'; | |
18 public neo4jBaseUrl = 'http://localhost:7474/db/data'; | |
19 public neo4jAuthentication = {'user': 'neo4j', 'password': 'neo5j'}; | |
20 public typeAttribute = '_type'; | 18 public typeAttribute = '_type'; |
21 public excludedAttributes = {}; | 19 public excludedAttributes = {}; |
22 public state: QueryState; | 20 public state: QueryState; |
23 public objectTypes: string[]; | 21 public objectTypes: string[]; |
24 | 22 |
45 | 43 |
46 /** | 44 /** |
47 * return the first set of options for the given query mode. | 45 * return the first set of options for the given query mode. |
48 */ | 46 */ |
49 getQueryOptions(queryMode: QueryMode) { | 47 getQueryOptions(queryMode: QueryMode) { |
50 var options = []; | 48 let options = []; |
51 if (queryMode == null) return options; | 49 if (queryMode == null) return options; |
52 if (queryMode.id === 'type_is') { | 50 if (queryMode.id === 'type_is') { |
53 options = this.objectTypes; | 51 options = this.objectTypes; |
54 } else if (queryMode.id === 'relation_is') { | 52 } else if (queryMode.id === 'relation_is') { |
55 options = this.state.resultRelations; | 53 options = this.state.resultRelations; |
66 | 64 |
67 /** | 65 /** |
68 * fetch all object types from Neo4j and store in this.objectTypes. | 66 * fetch all object types from Neo4j and store in this.objectTypes. |
69 */ | 67 */ |
70 setupObjectTypes() { | 68 setupObjectTypes() { |
71 var query = `MATCH (n) WITH DISTINCT labels(n) AS labels | 69 let query = `MATCH (n) WITH DISTINCT labels(n) AS labels |
72 UNWIND labels AS label | 70 UNWIND labels AS label |
73 RETURN DISTINCT label ORDER BY label`; | 71 RETURN DISTINCT label ORDER BY label`; |
74 | 72 |
75 var res = this.fetchCypherResults([query]); | 73 let res = this.fetchCypherResults([query]); |
76 res.subscribe( | 74 res.subscribe( |
77 data => { | 75 data => { |
78 console.debug("neo4j data=", data); | 76 console.debug("neo4j data=", data); |
79 this.objectTypes = data.results[0].data.map(elem => elem.row[0]).filter(elem => elem[0] != "_"); | 77 this.objectTypes = data.results[0].data.map(elem => elem.row[0]).filter(elem => elem[0] != "_"); |
80 console.debug("object types=", this.objectTypes); | 78 console.debug("object types=", this.objectTypes); |
95 * Create the cypher queries for the current query state. | 93 * Create the cypher queries for the current query state. |
96 * | 94 * |
97 * Updates the queries for results, attributes and relations. | 95 * Updates the queries for results, attributes and relations. |
98 */ | 96 */ |
99 createCypherQuery() { | 97 createCypherQuery() { |
100 var queryMatch = ''; | 98 let queryMatch = ''; |
101 var queryWhere = ''; | 99 let queryWhere = ''; |
102 var queryReturn = ''; | 100 let queryReturn = ''; |
103 var queryParams = {}; | 101 let queryParams = {}; |
104 var resultQuery = ''; | 102 let resultQuery = ''; |
105 var attributesQuery = ''; | 103 let attributesQuery = ''; |
106 var outRelsQuery = ''; | 104 let outRelsQuery = ''; |
107 var inRelsQuery = ''; | 105 let inRelsQuery = ''; |
108 var returnType = ''; | 106 let returnType = ''; |
109 var nIdx = 1; | 107 let nIdx = 1; |
110 this.state.steps.forEach((step, stepIdx) => { | 108 this.state.steps.forEach((step, stepIdx) => { |
111 var mode = step.mode.id; | 109 let mode = step.mode.id; |
112 var params = step.params; | 110 let params = step.params; |
113 | 111 |
114 /* | 112 /* |
115 * step: object type is | 113 * step: object type is |
116 */ | 114 */ |
117 if (mode === 'type_is') { | 115 if (mode === 'type_is') { |
226 this.createCypherQuery(); | 224 this.createCypherQuery(); |
227 this.state.resultInfo = 'loading...'; | 225 this.state.resultInfo = 'loading...'; |
228 /* | 226 /* |
229 * run query for result table | 227 * run query for result table |
230 */ | 228 */ |
231 var queries = [this.state.resultCypherQuery]; | 229 let queries = [this.state.resultCypherQuery]; |
232 var params = [this.state.cypherQueryParams]; | 230 let params = [this.state.cypherQueryParams]; |
233 if (this.state.attributesCypherQuery) { | 231 if (this.state.attributesCypherQuery) { |
234 queries.push(this.state.attributesCypherQuery); | 232 queries.push(this.state.attributesCypherQuery); |
235 params.push(this.state.cypherQueryParams); | 233 params.push(this.state.cypherQueryParams); |
236 } | 234 } |
237 if (this.state.outRelsCypherQuery) { | 235 if (this.state.outRelsCypherQuery) { |
240 } | 238 } |
241 if (this.state.inRelsCypherQuery) { | 239 if (this.state.inRelsCypherQuery) { |
242 queries.push(this.state.inRelsCypherQuery); | 240 queries.push(this.state.inRelsCypherQuery); |
243 params.push(this.state.cypherQueryParams); | 241 params.push(this.state.cypherQueryParams); |
244 } | 242 } |
245 var res = this.fetchCypherResults(queries, params); | 243 let res = this.fetchCypherResults(queries, params); |
246 res.subscribe( | 244 res.subscribe( |
247 data => { | 245 data => { |
248 console.debug("neo4j result data=", data); | 246 console.debug("neo4j result data=", data); |
249 var resIdx = 0; | 247 let resIdx = 0; |
250 /* | 248 /* |
251 * results for result table | 249 * results for result table |
252 */ | 250 */ |
253 this.state.results = data.results[resIdx].data.map(elem => elem.row[0]); | 251 this.state.results = data.results[resIdx].data.map(elem => elem.row[0]); |
254 this.state.numResults = this.state.results.length; | 252 this.state.numResults = this.state.results.length; |
261 } else { | 259 } else { |
262 resTypes[t] += 1; | 260 resTypes[t] += 1; |
263 } | 261 } |
264 }); | 262 }); |
265 let info = ''; | 263 let info = ''; |
266 for (var t in resTypes) { | 264 for (let t in resTypes) { |
267 info += t + '(' + resTypes[t] + ') '; | 265 info += t + '(' + resTypes[t] + ') '; |
268 } | 266 } |
269 info = info.substr(0, info.length-1); | 267 info = info.substr(0, info.length-1); |
270 this.state.resultInfo = info; | 268 this.state.resultInfo = info; |
271 // save info also in last step | 269 // save info also in last step |
309 ); | 307 ); |
310 } | 308 } |
311 | 309 |
312 | 310 |
313 filterAttributes(attributes: string[], normalized=false) { | 311 filterAttributes(attributes: string[], normalized=false) { |
314 var atts = []; | 312 let atts = []; |
315 if (normalized) { | 313 if (normalized) { |
316 attributes.forEach((att) => { | 314 attributes.forEach((att) => { |
317 if (att.substr(0, 3) == "_n_") { | 315 if (att.substr(0, 3) == "_n_") { |
318 atts.push(att.substr(3)); | 316 atts.push(att.substr(3)); |
319 } | 317 } |
329 * | 327 * |
330 * Returns an Observable with the results. | 328 * Returns an Observable with the results. |
331 */ | 329 */ |
332 fetchCypherResults(queries: string[], params=[{}]) { | 330 fetchCypherResults(queries: string[], params=[{}]) { |
333 console.debug("fetching cypher queries: ", queries); | 331 console.debug("fetching cypher queries: ", queries); |
334 var headers = new Headers(); | 332 let headers = new Headers(); |
335 var auth = this.neo4jAuthentication; | 333 let auth = NEO4J_AUTHENTICATION; |
336 headers.append('Authorization', 'Basic ' + btoa(`${auth.user}:${auth.password}`)); | 334 headers.append('Authorization', 'Basic ' + btoa(`${auth.user}:${auth.password}`)); |
337 headers.append('Content-Type', 'application/json'); | 335 headers.append('Content-Type', 'application/json'); |
338 headers.append('Accept', 'application/json'); | 336 headers.append('Accept', 'application/json'); |
339 // put headers in options | 337 // put headers in options |
340 var opts = {'headers': headers}; | 338 let opts = {'headers': headers}; |
341 // unpack queries into statements | 339 // unpack queries into statements |
342 var statements = queries.map((q, i) => { | 340 let statements = queries.map((q, i) => { |
343 return {'statement': q, 'parameters': (params[i])?params[i]:{}}; | 341 return {'statement': q, 'parameters': (params[i])?params[i]:{}}; |
344 }); | 342 }); |
345 // create POST data from query | 343 // create POST data from query |
346 var data = JSON.stringify({'statements': statements}); | 344 let data = JSON.stringify({'statements': statements}); |
347 // make post request asynchronously | 345 // make post request asynchronously |
348 var resp = this._http.post(this.neo4jBaseUrl+'/transaction/commit', data, opts) | 346 let resp = this._http.post(NEO4J_BASE_URL+'/transaction/commit', data, opts) |
349 // filter result as JSON | 347 // filter result as JSON |
350 .map(res => res.json()); | 348 .map(res => res.json()); |
351 // return Observable | 349 // return Observable |
352 return resp; | 350 return resp; |
353 } | 351 } |