nicefox-graphdb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +417 -0
- package/package.json +78 -0
- package/packages/nicefox-graphdb/LICENSE +21 -0
- package/packages/nicefox-graphdb/README.md +417 -0
- package/packages/nicefox-graphdb/dist/auth.d.ts +66 -0
- package/packages/nicefox-graphdb/dist/auth.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/auth.js +148 -0
- package/packages/nicefox-graphdb/dist/auth.js.map +1 -0
- package/packages/nicefox-graphdb/dist/backup.d.ts +51 -0
- package/packages/nicefox-graphdb/dist/backup.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/backup.js +201 -0
- package/packages/nicefox-graphdb/dist/backup.js.map +1 -0
- package/packages/nicefox-graphdb/dist/cli-helpers.d.ts +17 -0
- package/packages/nicefox-graphdb/dist/cli-helpers.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/cli-helpers.js +121 -0
- package/packages/nicefox-graphdb/dist/cli-helpers.js.map +1 -0
- package/packages/nicefox-graphdb/dist/cli.d.ts +3 -0
- package/packages/nicefox-graphdb/dist/cli.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/cli.js +660 -0
- package/packages/nicefox-graphdb/dist/cli.js.map +1 -0
- package/packages/nicefox-graphdb/dist/db.d.ts +118 -0
- package/packages/nicefox-graphdb/dist/db.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/db.js +245 -0
- package/packages/nicefox-graphdb/dist/db.js.map +1 -0
- package/packages/nicefox-graphdb/dist/executor.d.ts +272 -0
- package/packages/nicefox-graphdb/dist/executor.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/executor.js +3579 -0
- package/packages/nicefox-graphdb/dist/executor.js.map +1 -0
- package/packages/nicefox-graphdb/dist/index.d.ts +54 -0
- package/packages/nicefox-graphdb/dist/index.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/index.js +74 -0
- package/packages/nicefox-graphdb/dist/index.js.map +1 -0
- package/packages/nicefox-graphdb/dist/local.d.ts +7 -0
- package/packages/nicefox-graphdb/dist/local.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/local.js +115 -0
- package/packages/nicefox-graphdb/dist/local.js.map +1 -0
- package/packages/nicefox-graphdb/dist/parser.d.ts +300 -0
- package/packages/nicefox-graphdb/dist/parser.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/parser.js +1891 -0
- package/packages/nicefox-graphdb/dist/parser.js.map +1 -0
- package/packages/nicefox-graphdb/dist/remote.d.ts +6 -0
- package/packages/nicefox-graphdb/dist/remote.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/remote.js +87 -0
- package/packages/nicefox-graphdb/dist/remote.js.map +1 -0
- package/packages/nicefox-graphdb/dist/routes.d.ts +31 -0
- package/packages/nicefox-graphdb/dist/routes.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/routes.js +202 -0
- package/packages/nicefox-graphdb/dist/routes.js.map +1 -0
- package/packages/nicefox-graphdb/dist/translator.d.ts +136 -0
- package/packages/nicefox-graphdb/dist/translator.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/translator.js +4849 -0
- package/packages/nicefox-graphdb/dist/translator.js.map +1 -0
- package/packages/nicefox-graphdb/dist/types.d.ts +133 -0
- package/packages/nicefox-graphdb/dist/types.d.ts.map +1 -0
- package/packages/nicefox-graphdb/dist/types.js +21 -0
- package/packages/nicefox-graphdb/dist/types.js.map +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Conrad Lelubre
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
# NiceFox GraphDB
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/nicefox-graphdb)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
A lightweight graph database with Cypher query support, powered by SQLite.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install nicefox-graphdb
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { GraphDB } from 'nicefox-graphdb';
|
|
18
|
+
|
|
19
|
+
const db = await GraphDB({
|
|
20
|
+
url: 'https://my-graphdb.example.com',
|
|
21
|
+
project: 'myapp',
|
|
22
|
+
apiKey: process.env.GRAPHDB_API_KEY,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Create nodes and relationships
|
|
26
|
+
await db.execute(`
|
|
27
|
+
CREATE (alice:User {name: 'Alice'})-[:FOLLOWS]->(bob:User {name: 'Bob'})
|
|
28
|
+
`);
|
|
29
|
+
|
|
30
|
+
// Query the graph
|
|
31
|
+
const users = await db.query('MATCH (u:User) RETURN u.name AS name');
|
|
32
|
+
console.log(users); // [{ name: 'Alice' }, { name: 'Bob' }]
|
|
33
|
+
|
|
34
|
+
db.close();
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Development vs Production Mode
|
|
38
|
+
|
|
39
|
+
NiceFox GraphDB automatically adapts based on the `NODE_ENV` environment variable:
|
|
40
|
+
|
|
41
|
+
| Mode | `NODE_ENV` | Behavior |
|
|
42
|
+
|------|-----------|----------|
|
|
43
|
+
| **Development** | `development` | Uses local SQLite database. `url` and `apiKey` are ignored. |
|
|
44
|
+
| **Production** | `production` (or unset) | Connects to remote server via HTTP. `url` and `apiKey` are required. |
|
|
45
|
+
|
|
46
|
+
This means you can use the **exact same code** in both environments:
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// Works in both development and production!
|
|
50
|
+
const db = await GraphDB({
|
|
51
|
+
url: 'https://my-graphdb.example.com',
|
|
52
|
+
project: 'myapp',
|
|
53
|
+
apiKey: process.env.GRAPHDB_API_KEY,
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Development Mode
|
|
58
|
+
|
|
59
|
+
When `NODE_ENV=development`:
|
|
60
|
+
- A local SQLite database is created automatically
|
|
61
|
+
- No server setup required
|
|
62
|
+
- `url` and `apiKey` parameters are ignored
|
|
63
|
+
- Data persists at `./data/{env}/{project}.db` by default
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Run your app in development mode
|
|
67
|
+
NODE_ENV=development node app.js
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Production Mode
|
|
71
|
+
|
|
72
|
+
When `NODE_ENV=production` (or unset):
|
|
73
|
+
- Connects to a remote GraphDB server via HTTP
|
|
74
|
+
- `url` and `apiKey` are required
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Run your app in production mode
|
|
78
|
+
NODE_ENV=production GRAPHDB_API_KEY=xxx node app.js
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Configuration Options
|
|
82
|
+
|
|
83
|
+
| Option | Type | Required | Default | Description |
|
|
84
|
+
|--------|------|----------|---------|-------------|
|
|
85
|
+
| `url` | `string` | Yes | - | Base URL of the GraphDB server (used in production) |
|
|
86
|
+
| `project` | `string` | Yes | - | Project name |
|
|
87
|
+
| `apiKey` | `string` | No | - | API key for authentication (used in production) |
|
|
88
|
+
| `env` | `'production' \| 'test'` | No | `'production'` | Environment (determines database isolation) |
|
|
89
|
+
| `dataPath` | `string` | No | `'./data'` | Path for local data storage (development only). Use `':memory:'` for in-memory database |
|
|
90
|
+
|
|
91
|
+
### Examples
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
// Production: connect to remote server
|
|
95
|
+
const db = await GraphDB({
|
|
96
|
+
url: 'https://graphdb.example.com',
|
|
97
|
+
project: 'myapp',
|
|
98
|
+
apiKey: 'your-api-key',
|
|
99
|
+
env: 'production',
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Development: use local SQLite (url/apiKey ignored)
|
|
103
|
+
// NODE_ENV=development
|
|
104
|
+
const db = await GraphDB({
|
|
105
|
+
url: 'https://graphdb.example.com', // ignored
|
|
106
|
+
project: 'myapp',
|
|
107
|
+
apiKey: 'your-api-key', // ignored
|
|
108
|
+
dataPath: './local-data', // custom data directory
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Testing: use in-memory database
|
|
112
|
+
// NODE_ENV=development
|
|
113
|
+
const db = await GraphDB({
|
|
114
|
+
url: 'https://graphdb.example.com',
|
|
115
|
+
project: 'test-project',
|
|
116
|
+
dataPath: ':memory:', // resets on each run
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## API Reference
|
|
121
|
+
|
|
122
|
+
### `GraphDB(options): Promise<GraphDBClient>`
|
|
123
|
+
|
|
124
|
+
Create a new GraphDB client. Returns a promise that resolves to a client instance.
|
|
125
|
+
|
|
126
|
+
### `db.query<T>(cypher, params?): Promise<T[]>`
|
|
127
|
+
|
|
128
|
+
Execute a Cypher query and return results as an array.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
const users = await db.query<{ name: string; age: number }>(
|
|
132
|
+
'MATCH (u:User) WHERE u.age > $minAge RETURN u.name AS name, u.age AS age',
|
|
133
|
+
{ minAge: 21 }
|
|
134
|
+
);
|
|
135
|
+
// users = [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 30 }]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### `db.execute(cypher, params?): Promise<void>`
|
|
139
|
+
|
|
140
|
+
Execute a mutating query (CREATE, SET, DELETE, MERGE) without expecting return data.
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
await db.execute('CREATE (n:User {name: $name, email: $email})', {
|
|
144
|
+
name: 'Alice',
|
|
145
|
+
email: 'alice@example.com'
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### `db.queryRaw<T>(cypher, params?): Promise<QueryResponse<T>>`
|
|
150
|
+
|
|
151
|
+
Execute a query and return the full response including metadata.
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
const response = await db.queryRaw('MATCH (n) RETURN n LIMIT 10');
|
|
155
|
+
console.log(response.meta.count); // Number of rows
|
|
156
|
+
console.log(response.meta.time_ms); // Query execution time in ms
|
|
157
|
+
console.log(response.data); // Array of results
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### `db.createNode(label, properties?): Promise<string>`
|
|
161
|
+
|
|
162
|
+
Create a node and return its ID.
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
const userId = await db.createNode('User', { name: 'Alice', email: 'alice@example.com' });
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### `db.getNode(label, filter): Promise<Record<string, unknown> | null>`
|
|
169
|
+
|
|
170
|
+
Find a node by label and properties.
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
const user = await db.getNode('User', { email: 'alice@example.com' });
|
|
174
|
+
if (user) {
|
|
175
|
+
console.log(user.name); // 'Alice'
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### `db.updateNode(id, properties): Promise<void>`
|
|
180
|
+
|
|
181
|
+
Update properties on a node.
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
await db.updateNode(userId, { name: 'Alice Smith', verified: true });
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### `db.deleteNode(id): Promise<void>`
|
|
188
|
+
|
|
189
|
+
Delete a node and all its relationships (DETACH DELETE).
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
await db.deleteNode(userId);
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### `db.createEdge(sourceId, type, targetId, properties?): Promise<void>`
|
|
196
|
+
|
|
197
|
+
Create a relationship between two nodes.
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
await db.createEdge(aliceId, 'FOLLOWS', bobId, { since: '2024-01-01' });
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### `db.health(): Promise<{ status: string; timestamp: string }>`
|
|
204
|
+
|
|
205
|
+
Check server health. In development mode, always returns `{ status: 'ok', ... }`.
|
|
206
|
+
|
|
207
|
+
### `db.close(): void`
|
|
208
|
+
|
|
209
|
+
Close the client and release resources. **Always call this when done.**
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
const db = await GraphDB({ ... });
|
|
213
|
+
try {
|
|
214
|
+
// ... use db
|
|
215
|
+
} finally {
|
|
216
|
+
db.close();
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Cypher Quick Reference
|
|
221
|
+
|
|
222
|
+
### Supported Clauses
|
|
223
|
+
|
|
224
|
+
| Clause | Example |
|
|
225
|
+
|--------|---------|
|
|
226
|
+
| `CREATE` | `CREATE (n:User {name: 'Alice'})` |
|
|
227
|
+
| `MATCH` | `MATCH (n:User) RETURN n` |
|
|
228
|
+
| `OPTIONAL MATCH` | `OPTIONAL MATCH (n)-[:KNOWS]->(m) RETURN m` |
|
|
229
|
+
| `MERGE` | `MERGE (n:User {email: $email})` |
|
|
230
|
+
| `WHERE` | `WHERE n.age > 21 AND n.active = true` |
|
|
231
|
+
| `SET` | `SET n.name = 'Bob', n.updated = true` |
|
|
232
|
+
| `DELETE` | `DELETE n` |
|
|
233
|
+
| `DETACH DELETE` | `DETACH DELETE n` |
|
|
234
|
+
| `RETURN` | `RETURN n.name AS name, count(*) AS total` |
|
|
235
|
+
| `WITH` | `WITH n, count(*) AS cnt WHERE cnt > 1` |
|
|
236
|
+
| `UNWIND` | `UNWIND $list AS item CREATE (n {value: item})` |
|
|
237
|
+
| `UNION / UNION ALL` | `MATCH (n:A) RETURN n UNION MATCH (m:B) RETURN m` |
|
|
238
|
+
| `ORDER BY` | `ORDER BY n.name DESC` |
|
|
239
|
+
| `SKIP / LIMIT` | `SKIP 10 LIMIT 5` |
|
|
240
|
+
| `DISTINCT` | `RETURN DISTINCT n.category` |
|
|
241
|
+
| `CASE/WHEN` | `RETURN CASE WHEN n.age > 18 THEN 'adult' ELSE 'minor' END` |
|
|
242
|
+
| `CALL` | `CALL db.labels() YIELD label RETURN label` |
|
|
243
|
+
|
|
244
|
+
### Operators
|
|
245
|
+
|
|
246
|
+
| Category | Operators |
|
|
247
|
+
|----------|-----------|
|
|
248
|
+
| Comparison | `=`, `<>`, `<`, `>`, `<=`, `>=` |
|
|
249
|
+
| Logical | `AND`, `OR`, `NOT` |
|
|
250
|
+
| String | `CONTAINS`, `STARTS WITH`, `ENDS WITH` |
|
|
251
|
+
| List | `IN` |
|
|
252
|
+
| Null | `IS NULL`, `IS NOT NULL` |
|
|
253
|
+
| Pattern | `EXISTS` |
|
|
254
|
+
| Arithmetic | `+`, `-`, `*`, `/`, `%` |
|
|
255
|
+
|
|
256
|
+
### Functions
|
|
257
|
+
|
|
258
|
+
**Aggregation:** `COUNT`, `SUM`, `AVG`, `MIN`, `MAX`, `COLLECT`
|
|
259
|
+
|
|
260
|
+
**Scalar:** `ID`, `coalesce`
|
|
261
|
+
|
|
262
|
+
**String:** `toUpper`, `toLower`, `trim`, `substring`, `replace`, `toString`, `split`
|
|
263
|
+
|
|
264
|
+
**List:** `size`, `head`, `last`, `tail`, `keys`, `range`
|
|
265
|
+
|
|
266
|
+
**Node/Relationship:** `labels`, `type`, `properties`
|
|
267
|
+
|
|
268
|
+
**Math:** `abs`, `ceil`, `floor`, `round`, `rand`, `sqrt`
|
|
269
|
+
|
|
270
|
+
**Date/Time:** `date`, `datetime`, `timestamp`
|
|
271
|
+
|
|
272
|
+
### Variable-Length Paths
|
|
273
|
+
|
|
274
|
+
```cypher
|
|
275
|
+
-- Find friends of friends (1 to 3 hops)
|
|
276
|
+
MATCH (a:User {name: 'Alice'})-[:KNOWS*1..3]->(b:User)
|
|
277
|
+
RETURN DISTINCT b.name
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Procedures
|
|
281
|
+
|
|
282
|
+
```cypher
|
|
283
|
+
-- List all labels
|
|
284
|
+
CALL db.labels() YIELD label RETURN label
|
|
285
|
+
|
|
286
|
+
-- List all relationship types
|
|
287
|
+
CALL db.relationshipTypes() YIELD type RETURN type
|
|
288
|
+
|
|
289
|
+
-- List all property keys
|
|
290
|
+
CALL db.propertyKeys() YIELD key RETURN key
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Running the Server (Production)
|
|
294
|
+
|
|
295
|
+
For production deployments, run a dedicated server:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
# Start the server
|
|
299
|
+
npx nicefox-graphdb serve --port 3000 --data ./data
|
|
300
|
+
|
|
301
|
+
# Or with custom host binding
|
|
302
|
+
npx nicefox-graphdb serve --port 3000 --host 0.0.0.0 --data ./data
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Creating Projects
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
# Create a new project (generates API keys)
|
|
309
|
+
npx nicefox-graphdb create myapp --data ./data
|
|
310
|
+
|
|
311
|
+
# Output:
|
|
312
|
+
# [created] production/myapp.db
|
|
313
|
+
# [created] test/myapp.db
|
|
314
|
+
# API Keys:
|
|
315
|
+
# production: nfx_abc123...
|
|
316
|
+
# test: nfx_def456...
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### CLI Reference
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
# Server
|
|
323
|
+
nicefox-graphdb serve [options]
|
|
324
|
+
-p, --port <port> Port to listen on (default: 3000)
|
|
325
|
+
-d, --data <path> Data directory (default: /var/data/nicefox-graphdb)
|
|
326
|
+
-H, --host <host> Host to bind to (default: localhost)
|
|
327
|
+
-b, --backup <path> Backup directory (enables backup endpoints)
|
|
328
|
+
|
|
329
|
+
# Project management
|
|
330
|
+
nicefox-graphdb create <project> Create new project with API keys
|
|
331
|
+
nicefox-graphdb delete <project> Delete project (use --force)
|
|
332
|
+
nicefox-graphdb list List all projects
|
|
333
|
+
|
|
334
|
+
# Environment management
|
|
335
|
+
nicefox-graphdb clone <project> Copy production to test
|
|
336
|
+
nicefox-graphdb wipe <project> Clear test database
|
|
337
|
+
|
|
338
|
+
# Direct queries
|
|
339
|
+
nicefox-graphdb query <env> <project> "CYPHER"
|
|
340
|
+
|
|
341
|
+
# Backup
|
|
342
|
+
nicefox-graphdb backup [options]
|
|
343
|
+
-o, --output <path> Backup directory
|
|
344
|
+
-p, --project <name> Backup specific project
|
|
345
|
+
--status Show backup status
|
|
346
|
+
|
|
347
|
+
# API keys
|
|
348
|
+
nicefox-graphdb apikey add <project>
|
|
349
|
+
nicefox-graphdb apikey list
|
|
350
|
+
nicefox-graphdb apikey remove <prefix>
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Why NiceFox?
|
|
354
|
+
|
|
355
|
+
| Feature | NiceFox GraphDB | Neo4j |
|
|
356
|
+
|---------|-----------------|-------|
|
|
357
|
+
| **Deployment** | Single package, zero config | Complex setup, JVM required |
|
|
358
|
+
| **Development** | Local SQLite, no server needed | Server required |
|
|
359
|
+
| **Backup** | Just copy the SQLite file | Enterprise license required |
|
|
360
|
+
| **Resource usage** | ~50MB RAM | 1GB+ RAM minimum |
|
|
361
|
+
| **Cypher support** | Core subset | Full |
|
|
362
|
+
| **Cost** | Free, MIT license | Free tier limited |
|
|
363
|
+
|
|
364
|
+
NiceFox is ideal for:
|
|
365
|
+
- Applications needing graph queries without ops burden
|
|
366
|
+
- Projects that outgrow JSON but don't need a full graph database
|
|
367
|
+
- Self-hosted deployments where simplicity matters
|
|
368
|
+
- Development and testing with instant local databases
|
|
369
|
+
|
|
370
|
+
## Advanced Usage
|
|
371
|
+
|
|
372
|
+
### Direct Database Access
|
|
373
|
+
|
|
374
|
+
For advanced use cases, you can access the underlying components:
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
import { GraphDatabase, Executor, parse, translate } from 'nicefox-graphdb';
|
|
378
|
+
|
|
379
|
+
// Direct database access
|
|
380
|
+
const db = new GraphDatabase('./my-database.db');
|
|
381
|
+
db.initialize();
|
|
382
|
+
|
|
383
|
+
const executor = new Executor(db);
|
|
384
|
+
const result = executor.execute('MATCH (n) RETURN n LIMIT 10');
|
|
385
|
+
|
|
386
|
+
db.close();
|
|
387
|
+
|
|
388
|
+
// Parse Cypher to AST
|
|
389
|
+
const parseResult = parse('MATCH (n:User) RETURN n');
|
|
390
|
+
if (parseResult.success) {
|
|
391
|
+
console.log(parseResult.query);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Translate AST to SQL
|
|
395
|
+
const translation = translate(parseResult.query, {});
|
|
396
|
+
console.log(translation.statements);
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Running a Custom Server
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
import { createServer } from 'nicefox-graphdb';
|
|
403
|
+
import { serve } from '@hono/node-server';
|
|
404
|
+
|
|
405
|
+
const { app, dbManager } = createServer({
|
|
406
|
+
dataPath: './data',
|
|
407
|
+
apiKeys: {
|
|
408
|
+
'my-api-key': { project: 'myapp', env: 'production' }
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
serve({ fetch: app.fetch, port: 3000 });
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
## License
|
|
416
|
+
|
|
417
|
+
[MIT](https://github.com/co-l/nicefox-graphdb/blob/main/LICENSE) - Conrad Lelubre
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nicefox-graphdb",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "SQLite-based graph database with Cypher query support",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "packages/nicefox-graphdb/dist/index.js",
|
|
7
|
+
"types": "packages/nicefox-graphdb/dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"nicefox-graphdb": "./packages/nicefox-graphdb/dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./packages/nicefox-graphdb/dist/index.d.ts",
|
|
14
|
+
"import": "./packages/nicefox-graphdb/dist/index.js",
|
|
15
|
+
"default": "./packages/nicefox-graphdb/dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"packages/nicefox-graphdb/dist/**/*",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"prepare": "[ -d .git ] && cp hooks/pre-commit .git/hooks/ && chmod +x .git/hooks/pre-commit || true",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"test:coverage": "vitest run --coverage",
|
|
28
|
+
"dev": "pnpm --filter nicefox-graphdb-server dev",
|
|
29
|
+
"build": "pnpm -r build",
|
|
30
|
+
"tck": "npx tsx packages/server/test/tck/run-test.ts",
|
|
31
|
+
"prepublishOnly": "pnpm --filter nicefox-graphdb run build"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"better-sqlite3": "^11.0.0",
|
|
35
|
+
"hono": "^4.0.0",
|
|
36
|
+
"@hono/node-server": "^1.13.0",
|
|
37
|
+
"commander": "^12.0.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
41
|
+
"@types/node": "^22.0.0",
|
|
42
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
43
|
+
"typescript": "^5.3.0",
|
|
44
|
+
"vitest": "^2.0.0"
|
|
45
|
+
},
|
|
46
|
+
"pnpm": {
|
|
47
|
+
"onlyBuiltDependencies": [
|
|
48
|
+
"better-sqlite3",
|
|
49
|
+
"esbuild"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"keywords": [
|
|
53
|
+
"graph",
|
|
54
|
+
"database",
|
|
55
|
+
"graphdb",
|
|
56
|
+
"cypher",
|
|
57
|
+
"sqlite",
|
|
58
|
+
"typescript",
|
|
59
|
+
"neo4j",
|
|
60
|
+
"query"
|
|
61
|
+
],
|
|
62
|
+
"author": "Conrad Lelubre",
|
|
63
|
+
"license": "MIT",
|
|
64
|
+
"repository": {
|
|
65
|
+
"type": "git",
|
|
66
|
+
"url": "git+https://github.com/co-l/nicefox-graphdb.git"
|
|
67
|
+
},
|
|
68
|
+
"homepage": "https://github.com/co-l/nicefox-graphdb#readme",
|
|
69
|
+
"bugs": {
|
|
70
|
+
"url": "https://github.com/co-l/nicefox-graphdb/issues"
|
|
71
|
+
},
|
|
72
|
+
"engines": {
|
|
73
|
+
"node": ">=18.0.0"
|
|
74
|
+
},
|
|
75
|
+
"publishConfig": {
|
|
76
|
+
"access": "public"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Conrad Lelubre
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|