Skip to content

Commit 640e7ff

Browse files
committed
Merge branch 'dev' into canary
2 parents 9dfa7cd + d78af95 commit 640e7ff

File tree

11 files changed

+510
-18
lines changed

11 files changed

+510
-18
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package-lock.json
22
docs/api/*.json
3-
3+
docs/api/local_doc
44
.vscode
55

66
local_test

docs/createDocs.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//https://auth0.com/docs/api/management/v2#!/Clients/post_clients
2+
//https://terminusdb.eu.auth0.com/api/v2/
13
'use strict'
24
const jsdoc2md = require('jsdoc-to-markdown')
35
const fs = require('fs')

docs/index.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<div id="app"></div>
1313
<script>
1414
window.$docsify = {
15+
markdown: {renderer:{}},
1516
logo: 'https://terminusdb.com//img/logos/logo-dark.svg',
1617
name: 'TerminusDB Client',
1718
repo: 'https://github.com/terminusdb/terminusdb-client-js/tree/dev/docs',
@@ -29,7 +30,9 @@
2930
</script>
3031
<script src="//cdn.jsdelivr.net/npm/docsify-sidebar-collapse/dist/docsify-sidebar-collapse.min.js"></script>
3132
</script>
32-
<script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script>
33+
<script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script>
34+
35+
<script src="../node_modules/docsify/api/docsify.js"></script>
3336
<script
3437
src="//cdn.jsdelivr.net/npm/docsify-darklight-theme@latest/dist/index.min.js"
3538
type="text/javascript"></script>

lib/query/woqlSchema.js

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -331,30 +331,36 @@ WOQLQuery.prototype._oneOfList = function(cls, ids, graph) {
331331
*/
332332
WOQLQuery.prototype.deleteChoiceList = function(classId, graph) {
333333
graph = this._sg(graph)
334+
//if I have to remove multi enum together
335+
const sufVar = Date.now()
336+
const vRest = `v:Rest${sufVar}`
337+
const vClist = `v:Clist${sufVar}`
338+
const vEntry = `v:Entry${sufVar}`
339+
const vPath = `v:Path${sufVar}`
334340
return new WOQLQuery().and(
335341
new WOQLQuery().from(graph).and(
336342
new WOQLQuery()
337-
.select('v:Rest')
338-
.distinct('v:Rest')
339-
.triple(classId, 'owl:oneOf', 'v:Clist')
340-
.path('v:Clist', 'rdf:rest+', 'v:Entry', 'v:Path')
343+
.select(vRest)
344+
.distinct(vRest)
345+
.triple(classId, 'owl:oneOf', vClist)
346+
.path(vClist, 'rdf:rest+', vEntry, vPath)
341347
.or(
342-
new WOQLQuery().triple('v:Entry', 'rdf:first', 'v:Rest'),
348+
new WOQLQuery().triple(vEntry, 'rdf:first', vRest),
343349
new WOQLQuery()
344-
.triple('v:Clist', 'rdf:first', 'v:First')
345-
.eq('v:First', 'v:Rest'),
350+
.triple(vClist, 'rdf:first', `v:First${sufVar}`)
351+
.eq(`v:First${sufVar}`, vRest),
346352
),
347353
new WOQLQuery()
348-
.triple('v:Rest', 'v:valprop', 'v:valval')
349-
.triple('v:X', 'rdf:first', 'v:Rest')
350-
.triple('v:Y', 'rdf:rest', 'v:valRest')
351-
.triple(classId, 'v:classProp', 'v:classPropVal'),
354+
.triple(vRest, `v:valprop${sufVar}`, `v:valval${sufVar}`)
355+
.triple(`v:X${sufVar}`, 'rdf:first', vRest)
356+
.triple(`v:Y${sufVar}`, 'rdf:rest', `v:valRest${sufVar}`)
357+
.triple(classId, `v:classProp${sufVar}`, `v:classPropVal${sufVar}`),
352358
),
353359
new WOQLQuery()
354-
.delete_quad('v:Rest', 'v:valprop', 'v:valval', graph)
355-
.delete_quad('v:X', 'rdf:first', 'v:Rest', graph)
356-
.delete_quad('v:Y', 'rdf:rest', 'v:valRest', graph)
357-
.delete_quad(classId, 'v:classProp', 'v:classPropVal', graph),
360+
.delete_quad(vRest, `v:valprop${sufVar}`, `v:valval${sufVar}`, graph)
361+
.delete_quad(`v:X${sufVar}`, 'rdf:first', vRest, graph)
362+
.delete_quad(`v:Y${sufVar}`, 'rdf:rest', `v:valRest${sufVar}`, graph)
363+
.delete_quad(classId, `v:classProp${sufVar}`, `v:classPropVal${sufVar}`, graph),
358364
)
359365
}
360366

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
"webpack-dev-server": "^3.11.0"
5555
},
5656
"scripts": {
57-
"test005": "jsdoc2md --help",
5857
"mkdocs:multi": "node ./docs/createDocs.js",
5958
"mkdocs:src": "docco lib/*.js -l plain -x md -o docs/api",
6059
"mkdocs:api": "jsdoc2md --configure docs/doc_config.json --partial docs/partial/scope.hbs docs/partial/member-index.hbs docs/partial/header.hbs --helper docs/helper/format.js --files lib/woql.js lib/woqlClient.js lib/typedef.js > docs/api/api.js.md",

tutorial/bike/bike-tutorial.html

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<html>
2+
<head><title>Bike Tutorial Launch Page</title></head>
3+
<body>
4+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.9/css/all.css" integrity="sha384-5SOiIsAziJl6AWe0HWRKTXlfcSHKmYV4RBF18PPJ173Kzn7jzMyFuTtk8JA7QQG1" crossorigin="anonymous">
5+
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
6+
<script src="https://unpkg.com/@terminusdb/terminusdb-client/dist/terminusdb-client.min.js"></script>
7+
<script src="https://d3js.org/d3.v5.min.js"></script>
8+
<script src="https://unpkg.com/@terminusdb/terminusdb-react-components@4.2.1/dist/terminusdb-d3-graph.min.js"></script>
9+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.css">
10+
<script src="./bike-tutorial.js"></script>
11+
<div class="container">
12+
<div id="myresults" class="row">
13+
<div class="col mt-4">
14+
<a class="btn btn-secondary" href="#" onClick='runTutorial("https://127.0.0.1:6363/", "root", "bikestest005")'>Load Data</a>
15+
<a class="btn btn-secondary" href="#" onClick='getView("https://127.0.0.1:6363/", "root", "bikestest005")'>Visualise Graph Result</a>
16+
<div class="col">
17+
</div>
18+
<div class="row mt-2">
19+
<div id="target" style="overflow: hidden;" class="col border border-secondary"></div>
20+
</div>
21+
<ul class="list-group" id="loadfile">
22+
</li>
23+
</div>
24+
</body>
25+
</html>

tutorial/bike/bike-tutorial.js

Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
/**
2+
* This is a tutorial script for TerminusDB which demonstrates
3+
* the creation of a database from CSV files representing information about bicycle trips
4+
* on an urban program in Washington DC
5+
*/
6+
const TerminusClient = TerminusDBClient
7+
8+
/**
9+
* The list of CSV files that we want to import
10+
*/
11+
const csvs = [
12+
'https://terminusdb.com/t/data/bikeshare/2011-capitalbikeshare-tripdata.csv',
13+
'https://terminusdb.com/t/data/bikeshare/2012Q1-capitalbikeshare-tripdata.csv',
14+
'https://terminusdb.com/t/data/bikeshare/2010-capitalbikeshare-tripdata.csv',
15+
'https://terminusdb.com/t/data/bikeshare/2012Q2-capitalbikeshare-tripdata.csv',
16+
'https://terminusdb.com/t/data/bikeshare/2012Q3-capitalbikeshare-tripdata.csv',
17+
'https://terminusdb.com/t/data/bikeshare/2012Q4-capitalbikeshare-tripdata.csv',
18+
'https://terminusdb.com/t/data/bikeshare/2013Q1-capitalbikeshare-tripdata.csv',
19+
'https://terminusdb.com/t/data/bikeshare/2013Q2-capitalbikeshare-tripdata.csv',
20+
'https://terminusdb.com/t/data/bikeshare/2013Q3-capitalbikeshare-tripdata.csv',
21+
'https://terminusdb.com/t/data/bikeshare/2013Q4-capitalbikeshare-tripdata.csv',
22+
'https://terminusdb.com/t/data/bikeshare/2014Q1-capitalbikeshare-tripdata.csv',
23+
'https://terminusdb.com/t/data/bikeshare/2014Q2-capitalbikeshare-tripdata.csv',
24+
'https://terminusdb.com/t/data/bikeshare/2014Q3-capitalbikeshare-tripdata.csv',
25+
'https://terminusdb.com/t/data/bikeshare/2014Q4-capitalbikeshare-tripdata.csv',
26+
'https://terminusdb.com/t/data/bikeshare/2015Q1-capitalbikeshare-tripdata.csv',
27+
'https://terminusdb.com/t/data/bikeshare/2015Q2-capitalbikeshare-tripdata.csv',
28+
'https://terminusdb.com/t/data/bikeshare/2015Q3-capitalbikeshare-tripdata.csv',
29+
'https://terminusdb.com/t/data/bikeshare/2015Q4-capitalbikeshare-tripdata.csv',
30+
'https://terminusdb.com/t/data/bikeshare/2016Q1-capitalbikeshare-tripdata.csv',
31+
'https://terminusdb.com/t/data/bikeshare/2016Q2-capitalbikeshare-tripdata.csv',
32+
'https://terminusdb.com/t/data/bikeshare/2016Q3-capitalbikeshare-tripdata.csv',
33+
'https://terminusdb.com/t/data/bikeshare/2016Q4-capitalbikeshare-tripdata.csv',
34+
'https://terminusdb.com/t/data/bikeshare/2017Q1-capitalbikeshare-tripdata.csv',
35+
'https://terminusdb.com/t/data/bikeshare/2017Q2-capitalbikeshare-tripdata.csv',
36+
'https://terminusdb.com/t/data/bikeshare/2017Q3-capitalbikeshare-tripdata.csv',
37+
'https://terminusdb.com/t/data/bikeshare/2017Q4-capitalbikeshare-tripdata.csv',
38+
'https://terminusdb.com/t/data/bikeshare/201801_capitalbikeshare_tripdata.csv',
39+
'https://terminusdb.com/t/data/bikeshare/201802-capitalbikeshare-tripdata.csv',
40+
'https://terminusdb.com/t/data/bikeshare/201803-capitalbikeshare-tripdata.csv',
41+
'https://terminusdb.com/t/data/bikeshare/201804-capitalbikeshare-tripdata.csv',
42+
'https://terminusdb.com/t/data/bikeshare/201805-capitalbikeshare-tripdata.csv',
43+
'https://terminusdb.com/t/data/bikeshare/201806-capitalbikeshare-tripdata.csv',
44+
'https://terminusdb.com/t/data/bikeshare/201807-capitalbikeshare-tripdata.csv',
45+
'https://terminusdb.com/t/data/bikeshare/201808-capitalbikeshare-tripdata.csv',
46+
'https://terminusdb.com/t/data/bikeshare/201809-capitalbikeshare-tripdata.csv',
47+
'https://terminusdb.com/t/data/bikeshare/201810-capitalbikeshare-tripdata.csv',
48+
'https://terminusdb.com/t/data/bikeshare/201811-capitalbikeshare-tripdata.csv',
49+
'https://terminusdb.com/t/data/bikeshare/201812-capitalbikeshare-tripdata.csv',
50+
]
51+
52+
/**
53+
*
54+
* @param {WOQLClient} client
55+
* @param {String} id
56+
* @param {String} [title]
57+
* @param {String} [description]
58+
*/
59+
function createDatabase(client, id, title, description) {
60+
title = title || 'Bike Data'
61+
description = description || 'A Database for the Terminus Bikes Tutorial'
62+
const dbdetails = {id: id, label: title, comment: description, schema: true}
63+
return client.createDatabase(id, dbdetails)
64+
}
65+
66+
//shorthand so we don't have to type TerminusClient every time
67+
var WOQL = TerminusClient.WOQL
68+
69+
/**
70+
* The query which creates the schema
71+
* @param {WOQLClient} client
72+
*/
73+
function createSchema(client) {
74+
var schema = WOQL.and(
75+
WOQL.doctype('Station')
76+
.label('Bike Station')
77+
.description('A station where municipal bicycles are deposited'),
78+
WOQL.doctype('Bicycle').label('Bicycle'),
79+
WOQL.doctype('Journey')
80+
.label('Journey')
81+
.property('start_station', 'Station')
82+
.label('Start Station')
83+
.property('end_station', 'Station')
84+
.label('End Station')
85+
.property('duration', 'integer')
86+
.label('Journey Duration')
87+
.property('start_time', 'dateTime')
88+
.label('Time Started')
89+
.property('end_time', 'dateTime')
90+
.label('Time Ended')
91+
.property('journey_bicycle', 'Bicycle')
92+
.label('Bicycle Used'),
93+
)
94+
console.log('CREATE SCHEMA GRAPH')
95+
return client.query(schema)
96+
}
97+
98+
function appendData(text, id, addChild) {
99+
const el_id = `el_${id}`
100+
if (addChild) {
101+
var node = document.createElement('li')
102+
node.id = el_id
103+
node.className = 'list-group-item'
104+
node.append(text)
105+
document.getElementById('loadfile').prepend(node)
106+
} else {
107+
document.getElementById(el_id).innerHTML = text
108+
}
109+
}
110+
111+
/**
112+
* @param {WOQLClient} client
113+
* @param {array} arr - array of URLs to load CSVs from
114+
*/
115+
function loadCSVs(client, arr) {
116+
//If you call pop() on an empty array, it returns undefined.
117+
let next = arr.pop()
118+
if (next) {
119+
const csv = getCSVVariables(next)
120+
const inputQuery = WOQL.and(csv, ...wrangles)
121+
var answer = WOQL.and(inputQuery, insertQuery)
122+
appendData(`........loading csv ${next} ${arr.length} remaining`, arr.length, true)
123+
// console.log("PRETTY_PRINTER",answer.prettyPrinter())
124+
client
125+
.query(answer)
126+
.then(() => {
127+
appendData(`Imported ${next} `, arr.length)
128+
})
129+
.catch(() => {
130+
appendData(`Failed to import csv ${next} `, arr.length)
131+
})
132+
.finally(() => loadCSVs(client, arr))
133+
}
134+
}
135+
136+
/**
137+
* Extracting the data from a CSV and binding it to variables
138+
* @param {WOQLClient} client
139+
* @param {String} url - the URL of the CSV
140+
*/
141+
function getCSVVariables(url) {
142+
const csv = WOQL.get(
143+
WOQL.as('Start station', 'v:Start_Station')
144+
.as('End station', 'v:End_Station')
145+
.as('Start date', 'v:Start_Time')
146+
.as('End date', 'v:End_Time')
147+
.as('Duration', 'v:Duration')
148+
.as('Start station number', 'v:Start_ID')
149+
.as('End station number', 'v:End_ID')
150+
.as('Bike number', 'v:Bike')
151+
.as('Member type', 'v:Member_Type'),
152+
).remote(url)
153+
return csv
154+
}
155+
156+
/**
157+
* Wrangling the imported data to make it line up nicely
158+
*/
159+
const wrangles = [
160+
WOQL.idgen('doc:Journey', ['v:Start_ID', 'v:Start_Time', 'v:Bike'], 'v:Journey_ID'),
161+
WOQL.idgen('doc:Station', ['v:Start_ID'], 'v:Start_Station_URL'),
162+
WOQL.cast('v:Duration', 'xsd:integer', 'v:Duration_Cast'),
163+
WOQL.cast('v:Bike', 'xsd:string', 'v:Bike_Label'),
164+
WOQL.cast('v:Start_Time', 'xsd:dateTime', 'v:Start_Time_Cast'),
165+
WOQL.cast('v:End_Time', 'xsd:dateTime', 'v:End_Time_Cast'),
166+
WOQL.cast('v:Start_Station', 'xsd:string', 'v:Start_Station_Label'),
167+
WOQL.cast('v:End_Station', 'xsd:string', 'v:End_Station_Label'),
168+
WOQL.idgen('doc:Station', ['v:End_ID'], 'v:End_Station_URL'),
169+
WOQL.idgen('doc:Bicycle', ['v:Bike_Label'], 'v:Bike_URL'),
170+
WOQL.concat('v:Start_ID to v:End_ID at v:Start_Time', 'v:Journey_Label'),
171+
WOQL.concat(
172+
'Bike v:Bike from v:Start_Station to v:End_Station at v:Start_Time until v:End_Time',
173+
'v:Journey_Description',
174+
),
175+
]
176+
177+
const insertQuery = WOQL.and(
178+
WOQL.insert('v:Journey_ID', 'Journey')
179+
.label('v:Journey_Label')
180+
.description('v:Journey_Description')
181+
.property('start_time', 'v:Start_Time_Cast')
182+
.property('end_time', 'v:End_Time_Cast')
183+
.property('duration', 'v:Duration_Cast')
184+
.property('start_station', 'v:Start_Station_URL')
185+
.property('end_station', 'v:End_Station_URL')
186+
.property('journey_bicycle', 'v:Bike_URL'),
187+
WOQL.insert('v:Start_Station_URL', 'Station').label('v:Start_Station_Label'),
188+
WOQL.insert('v:End_Station_URL', 'Station').label('v:End_Station_Label'),
189+
WOQL.insert('v:Bike_URL', 'Bicycle').label('v:Bike_Label'),
190+
)
191+
192+
function getView(url, key, dbid) {
193+
appendData('.....loading data for visualization', 'view', true)
194+
var client = new TerminusClient.WOQLClient(url)
195+
client.connect({key: key, db: dbid}).then(() => {
196+
showView(client)
197+
})
198+
}
199+
200+
function showView(client) {
201+
const WOQL = TerminusClient.WOQL
202+
const View = TerminusClient.View
203+
var woql = WOQL.select('v:Start', 'v:Start_Label', 'v:End', 'v:End_Label').and(
204+
WOQL.triple('v:Journey', 'type', 'scm:Journey'),
205+
WOQL.triple('v:Journey', 'start_station', 'v:Start'),
206+
WOQL.opt().triple('v:Start', 'label', 'v:Start_Label'),
207+
WOQL.triple('v:Journey', 'end_station', 'v:End'),
208+
WOQL.opt().triple('v:End', 'label', 'v:End_Label'),
209+
WOQL.triple('v:Journey', 'journey_bicycle', 'v:Bike'),
210+
)
211+
const woqlGraphConfig = View.graph()
212+
woqlGraphConfig.height(500).width(1200)
213+
woqlGraphConfig.node('Start_Label', 'End_Label').hidden(true)
214+
woqlGraphConfig
215+
.node('End')
216+
.icon({color: [255, 255, 255], unicode: '\uf84a'})
217+
.text('v:End_Label')
218+
.size(25)
219+
.charge(-10)
220+
woqlGraphConfig
221+
.node('Start')
222+
.icon({color: [255, 255, 255], unicode: '\uf84a'})
223+
.text('v:Start_Label')
224+
.size(25)
225+
.collisionRadius(10)
226+
woqlGraphConfig.edge('Start', 'End').weight(100)
227+
228+
client
229+
.query(woql)
230+
.then(result => {
231+
const resultData = new TerminusClient.WOQLResult(result)
232+
233+
let viewer = woqlGraphConfig.create(null)
234+
235+
viewer.setResult(resultData)
236+
console.log(viewer.config)
237+
238+
const graphResult = new TerminusDBComponents.GraphResultsViewer(viewer.config, viewer)
239+
graphResult.load(document.getElementById('target'), true)
240+
appendData('the Data has been loaded', 'view')
241+
})
242+
.catch(err => {
243+
console.log(err)
244+
appendData(`ERROR in loadind data ${err.message}`, 'view')
245+
})
246+
}
247+
248+
/**
249+
* Runs the tutorial from start to finish
250+
* @param {String} terminus_server_url - url of the TerminusDB server
251+
* @param {String} terminus_server_key - key for access to the server
252+
* @param {String} terminus_db_id - id of the DB to be created in the tutorial
253+
*/
254+
async function runTutorial(terminus_server_url, terminus_server_key, terminus_db_id) {
255+
var client = new TerminusClient.WOQLClient(terminus_server_url)
256+
try {
257+
await client.connect({key: terminus_server_key})
258+
appendData('......creating database', '001', true)
259+
await createDatabase(client, terminus_db_id)
260+
appendData('The database as been created!!!!', '001')
261+
appendData('......creating schema', '002', true)
262+
await createSchema(client)
263+
appendData('The schema as been created!!!!', '002')
264+
loadCSVs(client, csvs)
265+
} catch (err) {
266+
appendData(`ERROR ${err.message}`, '003', true)
267+
}
268+
}

0 commit comments

Comments
 (0)