changeset 9:402c7229dc7c

more query generation.
author casties
date Wed, 20 Jan 2016 11:32:31 +0100
parents fa646ee46c19
children 66dce99cef4e
files app/query-result-row.component.ts app/query-result.component.ts app/query.service.ts
diffstat 3 files changed, 41 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/app/query-result-row.component.ts	Mon Jan 18 09:52:46 2016 +0100
+++ b/app/query-result-row.component.ts	Wed Jan 20 11:32:31 2016 +0100
@@ -3,8 +3,9 @@
 @Component({
     selector: 'query-result-row',
     template: `
-        <span *ngIf="rowType=='node'">{{rowData.data.label}}</span>
-        <span *ngIf="rowType=='text'">{{rowData}}</span>
+        <td *ngIf="rowType=='node'">{{rowData.type}}</td>
+        <td *ngIf="rowType=='node'">{{rowData.label}}</td>
+        <td *ngIf="rowType=='text'">{{rowData}}</td>
         `,
     inputs: ['rowData', 'rowType']
 })
--- a/app/query-result.component.ts	Mon Jan 18 09:52:46 2016 +0100
+++ b/app/query-result.component.ts	Wed Jan 20 11:32:31 2016 +0100
@@ -10,11 +10,15 @@
         <div *ngIf="queryState">
           <p>Cypher: {{queryState.cypherQuery}}</p>
           <p>Query results ({{queryState.numResults}}):</p>
-          <ul>
-            <li *ngFor="#row of queryState.results">
+          <table>
+            <tr>
+              <th *ngIf="queryState.resultTypes=='node'">Type</th>
+              <th *ngIf="queryState.resultTypes=='node'">Label</th>
+            </tr>
+            <tr *ngFor="#row of queryState.results">
               <query-result-row [rowData]="row" [rowType]="queryState.resultTypes"></query-result-row> 
-            </li>
-          </ul>
+            </tr>
+          </table>
         </div>
         `,
     directives: [QueryResultRowComponent],
--- a/app/query.service.ts	Mon Jan 18 09:52:46 2016 +0100
+++ b/app/query.service.ts	Wed Jan 20 11:32:31 2016 +0100
@@ -10,7 +10,7 @@
 @Injectable()
 export class QueryService {
         
-    public neo4jBaseUrl = 'http://localhost:7474/db/data/cypher/';
+    public neo4jBaseUrl = 'http://localhost:7474/db/data';
     public state: QueryState;
     public ismiObjectTypes: any;
     
@@ -44,6 +44,18 @@
     getQueryOptions(queryMode: QueryMode) {
         var options = ['a1', 'b1', 'c1'];
         if (queryMode.id === 'att_contains') {
+            if (this.state.attributeCypherQuery) {
+                var res = this.fetchCypherResult(this.state.attributeCypherQuery);
+                res.subscribe(
+                    data => {
+                        console.debug("neo4j data=", data);
+                        var atts = data.results[0].data.map(elem => elem.row[0]).filter(elem => elem[0] != "_");
+                        console.debug("ismi attributes=", atts);
+                    },
+                    err => console.error("neo4j error=", err),
+                    () => console.debug('neo4j query Complete')
+                );
+            }
             options = ['d', 'e', 'f'];
         } else if (queryMode.id === 'type_is') {
             options = this.ismiObjectTypes;
@@ -61,7 +73,7 @@
         res.subscribe(
             data => {
                 console.debug("neo4j data=", data);
-                this.ismiObjectTypes = data.data.map(elem => elem[0]).filter(elem => elem[0] != "_");
+                this.ismiObjectTypes = data.results[0].data.map(elem => elem.row[0]).filter(elem => elem[0] != "_");
                 console.debug("ismi types=", this.ismiObjectTypes);
                 },
             err => console.error("neo4j error=", err),
@@ -75,28 +87,32 @@
     }
     
     createCypherQuery() {
-        var cypher = '';
+        var resultCypher = '';
+        var attCypher = '';
         var returnType = '';
-        for (var i=0; i < this.state.steps.length; ++i) {
-            var step = this.state.steps[i];
+        this.state.steps.forEach((step) => {
             if (step.mode.id === 'type_is') {
-                cypher = `MATCH (e:${step.objectType}) return e`;
+                resultCypher = `MATCH (e:${step.objectType}) return e`;
                 returnType = 'node';
+                attCypher = `MATCH (e:${step.objectType}) WITH DISTINCT keys(e) AS atts
+                    UNWIND atts AS att 
+                    RETURN DISTINCT att ORDER BY att`;
             }
-        }
-        this.state.cypherQuery = cypher;
+        });
+        this.state.resultCypherQuery = resultCypher;
+        this.state.attributeCypherQuery = attCypher;
         this.state.resultTypes = returnType;
     }
     
     updateQuery() {
         this.createCypherQuery();
-        var query = this.state.cypherQuery;
+        var query = this.state.resultCypherQuery;
         var params = this.state.cypherParams;
         var res = this.fetchCypherResult(query, params);
         res.subscribe(
             data => {
                 console.debug("neo4j data=", data);
-                this.state.results = data.data.map(elem => elem[0]);
+                this.state.results = data.results[0].data.map(elem => elem.row[0]);
                 this.state.numResults = this.state.results.length;
             },
             err => console.error("neo4j error=", err),
@@ -112,9 +128,11 @@
         // put headers in options
         var opts = {'headers': headers};
         // create POST data from query
-        var data = JSON.stringify({'query': query, 'params': params});
+        var data = JSON.stringify({'statements': [
+            {'statement': query, 'parameters': params}
+            ]});
         // make post request asynchronously
-        var resp = this._http.post(this.neo4jBaseUrl, data, opts)
+        var resp = this._http.post(this.neo4jBaseUrl+'/transaction/commit', data, opts)
         // filter result as JSON
         .map(res => res.json());
         // return Observable