TuringDB natively imports JSONL files through the LOAD JSONL command. The expected format is compatible with Neo4j APOC’s JSON export (produced by apoc.export.json.all with useTypes:true).
If you are migrating from Neo4j, you do not need to write this file by hand — see the Neo4j import guide.
Expected file format
Each line is a self-contained JSON object representing either a node or a relationship:
{"type":"node","id":"0","labels":["Person"],"properties":{"name":"Alice","age":30}}
{"type":"node","id":"1","labels":["Person"],"properties":{"name":"Bob","age":25}}
{"type":"node","id":"2","labels":["Company"],"properties":{"name":"Acme Corp"}}
{"type":"relationship","id":"0","label":"KNOWS","start":{"id":"0"},"end":{"id":"1"},"properties":{"since":2021}}
{"type":"relationship","id":"1","label":"WORKS_AT","start":{"id":"0"},"end":{"id":"2"}}Nodes ("type": "node"):
| Field | Requirement |
|---|---|
type | Must be the string "node" |
id | Required. Integer or string parseable as integer. Ids do not need to be contiguous. |
labels | Required. Array with at least one label. |
properties | Optional. Dictionary with property keys and values. |
Relationships ("type": "relationship"):
| Field | Requirement |
|---|---|
type | Must be the string "relationship" |
id | Required. Integer or string parseable as integer. |
label | Required. Exactly one label. |
start / end | Required. Either: - a bare integer (or string parseable as integer) referencing a node id- a dictionary with an id key holding an integer (or string parseable as integer) referencing a node id. |
properties | Optional. Dictionary with property keys and values. |
Property values
- Scalars (strings, integers, doubles, booleans) become properties of the matching type, and
nullvalues are skipped. - Arrays load as List properties.
- Nested objects are stored as JSON strings.
- ISO date strings stay strings, and integer durations stay integers, unless you declare them (see below).
Each property name has a single type across the whole graph, so use the same type for a property on every node.
Loading date, duration and embedding properties
Typed options can be chained after the graph name:
LOAD JSONL 'mydata.jsonl' AS mygraph
WITH EMBEDDINGS [{"emb", 384}, {"summary_vec", 768}]
WITH DATETIMES [born, updatedAt]
WITH DURATIONS [tenure]WITH DATETIMES [prop, ...]parses ISO 8601 strings intoDateTimevalues.WITH DURATIONS [prop, ...]reads integers as microseconds and stores them asDurationvalues.WITH EMBEDDINGS [{"prop", dim}, ...]stores arrays asEmbeddingvalues, see below.
Loading embedding properties
An array-valued property is stored as a List by default. To load specific array properties as embeddings (type Embedding, usable with cosine_similarity / euclidean_distance), append a WITH EMBEDDINGS clause listing each embedding property and its dimension:
LOAD JSONL 'mydata.jsonl' AS mygraph WITH EMBEDDINGS [{"embedding", 384}, {"summary_vec", 768}]Each spec is {"<property name>", <dimension>}. The dimension must be greater than 1, and every array under that property must have exactly that many numeric elements. This works for both node and relationship properties. Array properties not listed in WITH EMBEDDINGS are stored as Lists.
When an import fails, additional details are written to <turing-dir>/logs/turingdb.log.
This sets embeddings as node/edge properties. To bulk-load embeddings onto an existing graph from a Parquet file, use LOAD EMBEDDING FROM instead.
Import steps
Place your file in the TuringDB data directory
TuringDB only reads external files from the data subdirectory of its working directory (set by -turing-dir, default $HOME/.turing).
cp mydata.jsonl ~/.turing/data/Load the file into a new graph
- Cypher
- Python SDK
LOAD JSONL 'mydata.jsonl' AS mygraphfrom turingdb import TuringDB
client = TuringDB(host="http://localhost:6666")
client.query("LOAD JSONL 'mydata.jsonl' AS mygraph")TuringDB creates a new graph named mygraph and populates it with all nodes and relationships from the file.
Set the graph as active and query it
- Cypher
- Python SDK
cd mygraph
MATCH (n) RETURN nclient.set_graph("mygraph")
df = client.query("MATCH (n) RETURN n")
print(df)Your JSONL data is now loaded and queryable as a TuringDB graph.
Verify the import
Use procedures to inspect what was imported:
- Cypher
- Python SDK
CALL db.labels()
CALL db.edgeTypes()
CALL db.propertyTypes()print(client.query("CALL db.labels()"))
print(client.query("CALL db.edgeTypes()"))
print(client.query("CALL db.propertyTypes()"))
