Query Troubleshooting
How to diagnose an Atlas query that errors, returns no rows, or returns rows you did not expect - with the exact message to look for and the fix for each.
Start here#
Almost every query question is one of four things, and the response tells you which.
| What you got back | Go to |
|---|---|
| An error message, or an HTTP status that is not 200 | The query returns an error |
| A valid result with no rows, or fewer rows than you expect | The query returns no rows |
| A valid result with rows in it, but not the rows you wanted | The query returns rows you did not expect |
| A value column reading null | Reading a live value |
Check the compiled model first#
Whatever the symptom, start by asking Atlas whether the model it is querying still matches your branch:
GET /api/v1/branches/{branch}/domains/{domain}/world
| What you see | What it means |
|---|---|
isStale: false |
The compiled model matches the branch, so a missing compile is not the cause. |
isStale: true |
The branch has moved on since this model was built. Recompile with PUT on the same URL. |
404 |
This domain has not been compiled on this branch yet. |
This read does not trigger a recompile, which makes it a better first move than recompiling straight away: a recompile can clear a symptom without telling you what it was, and it takes time on a large domain.
If compiledAtSha comes back blank, recompile once and the field is populated from then on.
Where you run the queries in this article#
POST /api/v1/branches/{branch}/domains/{domain}/queries
The body field is cypher:
{ "cypher": "MATCH (n:Pump) RETURN n.Label AS Pump LIMIT 10" }
A body with a different field name returns 400 and the message Cypher query string is required.
You can also paste any of these queries into Ask Gage, which prints result rows directly in the Atlas interface. See Querying with Cypher for the full picture of where queries run.
The query returns an error#
Atlas query errors are RFC-9457 problem documents (application/problem+json):
{
"type": "https://atlas.timebase.io/errors/invalid-request",
"title": "Invalid Request",
"status": 400,
"detail": "Syntax error at line 1:24 - mismatched input ')' expecting {...}",
"code": "Query.SyntaxError",
"traceId": "00-9f2c...-01"
}
The code field is the one to branch on in your client and the one to log.
code |
Status | What it means |
|---|---|---|
Query.NotCompiled |
400 | The domain has no compiled model on this branch. |
Query.SyntaxError |
400 | Atlas could not parse the query text. |
Query.Unsupported |
400 | The query parsed, but uses a clause or function outside the supported set. |
Query.SemanticError |
400 | The query parsed, but does not match the model. |
Query.ExecutionError |
500 | The engine could not complete the query. Quote the traceId when you contact support. |
Query.NotCompiled (HTTP 400)#
Symptom: every query against a domain fails immediately, with:
Domain '<domain>' on branch '<branch>' has not been compiled.
Call PUT /api/v1/branches/<branch>/domains/<domain>/world first.
Cause: there is no compiled model for this branch and domain pair.
Fix: compile the domain. In the interface, open the domain and select Compile on its Overview view. Over the API:
PUT /api/v1/branches/{branch}/domains/{domain}/world
Atlas recompiles every domain it knows about automatically at startup, so you do not need to compile again after a restart. If one domain stays uncompiled, see One domain stays uncompiled after a restart.
If the compile itself returns 422, see The compile did not complete.
Query.SyntaxError (HTTP 400)#
Symptom: the detail starts with Syntax error at line:
Syntax error at line 1:24 - <parser message>
The two numbers are the line and the character position, counted from zero. Go to that spot first; the position is usually more useful than the parser message after the dash.
| What you wrote | What to write instead |
|---|---|
MATCH n:Pump |
MATCH (n:Pump) - a node always needs its brackets. |
RETURN with nothing after it |
Every RETURN needs at least one column. |
UNWIND a.Vibration AS v WHERE v.Timestamp > ... |
Put a WITH between them: UNWIND a.Vibration AS v WITH a, v WHERE ... |
A trailing comma in a RETURN list |
Remove it. |
Both 'value' and "value" are valid string literals.
Query.Unsupported (HTTP 400)#
Symptom: the detail names a clause or function outside the supported set. These are the exact messages Atlas emits, so you can match what you see to a row:
detail you receive |
What to write instead |
|---|---|
CREATE clauses are not supported (also MERGE, DELETE, SET, REMOVE) |
Atlas Cypher is a read language. Change the model through the interface or the write API. |
CALL statements are not supported |
Use the CALL { ... } sub-query block form. |
CALL procedure invocations are not supported. Use CALL { ... } block form. |
Same - the block form is the supported one. |
CALL { ... } sub-queries must not contain UNION. |
Move the UNION outside the block. |
XOR expressions are not supported |
Write (a OR b) AND NOT (a AND b). |
Power (^) expressions are not supported |
Use repeated multiplication for small whole-number exponents, such as x * x for a square. |
Map literals are not supported |
Pass values as query parameters. |
Pattern comprehensions are not supported |
Rewrite as a separate MATCH and collect(). |
Filter expressions (ALL/ANY/NONE/SINGLE) are not supported |
Rewrite the condition as an ordinary WHERE. |
Pattern expressions in non-MATCH context are not supported |
A pattern such as (a)-[:feeds]->() belongs in a MATCH. |
EXISTS subquery expressions are not supported |
Use OPTIONAL MATCH - see Finding nodes without a relationship. |
Function '<name>' is not supported |
Check the function list in Querying with Cypher. For coalesce, write CASE WHEN x IS NULL THEN <default> ELSE x END. |
avg() and round() are available, as are the other functions listed in Querying with Cypher.
Query.SemanticError (HTTP 400)#
The query parsed but does not fit the model.
detail you receive |
Cause | Fix |
|---|---|---|
Variable "x" is not defined |
A name is used in WHERE or RETURN before any clause introduced it. |
Every variable must first appear in a MATCH, WITH or UNWIND. A WITH carries forward only the variables you name in it. |
Unknown label 'Pumps': no class in the compiled model matches it by URI or local name. |
A MATCH pattern names a type the compiled model does not have. Names are matched exactly, including case, and a type added since the last compile is not in the model yet. |
List the types that are there with the diagnostic query under The type name or property name does not match. Use the short name (Pump) or the full address in backticks. Compile if the type is new. |
Unknown relationship type 'feeds': no relationship type in the compiled model matches it by URI, local name or inverse name. |
A MATCH pattern names a relationship type the compiled model does not have. |
List the relationship types with MATCH ()-[r]->() RETURN DISTINCT type(r). Use the short name or the full address in backticks. |
Property 'Running.Value' is pinned differently across the types this pattern matches: Pump pins boolean, Tank pins double. Add a label that selects one type. |
The pattern can match more than one type, and those types pin the property's open leaf differently, so n.Running.Value has no single type. The pattern is unlabelled, has several labels, or has a label whose subtypes pin differently. See Pins on a Defer property in the openCypher Query Reference. |
Add a label that selects one type: MATCH (n:Pump) RETURN n.Running.Value. |
All UNION branches must return the same number of columns. Got: 3, 2 |
The two halves of a UNION return different column counts. |
Match the counts. Atlas compares counts rather than column names, and the Got: list shows what it saw. |
valueAt requires a bound or calculated compound property. '<name>' is static-stored - it has no temporal history. |
valueAt() was called on a property whose value is stored rather than fed from a source. |
Read it directly as n.PropertyName. |
valueAt requires a bound-compound property. '<name>' is not a compound property. |
valueAt() was called on a single-valued property. |
Read it directly as n.PropertyName. |
valueAt() reads both bound and calculated compound properties.
Finding nodes without a relationship#
To list the nodes that have no outgoing relationship of a given type, return the full set including the empty rows and select the empty ones in whatever consumes the result:
MATCH (p:Pump)
OPTIONAL MATCH (p)-[:feeds]->(t)
RETURN p.Label AS Pump, t.Label AS Feeds
Rows where Feeds is empty are the pumps with no outgoing feeds relationship. Filtering on the relationship variable inside the query - WHERE r IS NULL - is not supported and returns HTTP 500.
An HTTP call returns an HTML page instead of JSON#
Two causes produce this symptom, and neither is a query problem.
No access token. Every /api/v1 route requires a Timebase Pulse bearer token, and authentication is on by default. A call with no token is redirected to the Pulse sign-in page, so your client receives an HTML login form where it expected JSON.
A URL Atlas does not recognise. Atlas serves its single-page application for any URL outside the API surface, so a mistyped route returns HTTP 200 with an HTML body rather than a 404.
If the response body starts with <!doctype html>, check your token first and then your URL. These are the current routes:
| Purpose | Route |
|---|---|
| Compile a domain | PUT /api/v1/branches/{branch}/domains/{domain}/world |
| Run a query | POST /api/v1/branches/{branch}/domains/{domain}/queries |
| List branches | GET /api/v1/branches |
| List entity types | GET /api/v1/branches/{branch}/domains/{domain}/entity-types |
The query returns no rows#
You received a well-formed result with an empty data array, or fewer rows than you expect. Work down these causes in order.
Your changes are still in a draft session#
Symptom: you added a type or an instance, the save succeeded, the compile succeeded, and your query returns what it returned before.
Atlas keeps in-progress work in a private draft session until you publish it:
- A save that has outstanding validation violations is held in your draft session rather than written to the branch. The response carries an
Atlas-Validation-Violationsheader with the count. A clean save has no such header. - A compile run from inside a draft session builds your own copy and returns that result to you, leaving the shared model that everyone else queries in place. This keeps unpublished work out of other people's results.
Check whether you have one:
GET /api/v1/branches/{branch}/draft
Publish it:
GET /api/v1/branches/{branch}/domains/{domain}/validation # see what is outstanding
POST /api/v1/branches/{branch}/draft/publish # move the work onto the branch
PUT /api/v1/branches/{branch}/domains/{domain}/world # compile again
Every rule ID in the violation list is documented in Validation Rules Reference.
The compiled model is behind the branch#
Symptom: a recent change is not visible, and your save landed on the branch.
Check: GET .../world. If isStale is true, the branch has advanced past the commit the model was built from, in a way that touches this domain's files or a library it imports.
Fix: PUT .../world.
Compiling is idempotent and safe to repeat. If a compile does not complete, the model already in place keeps answering queries unchanged.
The compile did not complete#
Symptom: your compile returned HTTP 422 with a violations array, and queries return the previous data or Query.NotCompiled.
Cause: Atlas validates the whole domain before it builds, so one Error-severity violation stops the build. Nothing is partially compiled, and the model appears once the last Error is cleared.
Fix: read the violations, fix them, then compile:
GET /api/v1/branches/{branch}/domains/{domain}/validation
This returns the same violation records as the 422 body, plus errorCount, warningCount and blocking, and it changes nothing - use it as your fix-and-recheck loop. Every rule ID, its message and its fix is in Validation Rules Reference.
You are querying a different branch#
Symptom: the instances exist, and the query returns nothing.
The branch is part of the query URL, so querying main returns nothing when your instance maps are on a feature branch.
GET /api/v1/branches # what branches exist
GET /api/v1/worlds # which (branch, domain) pairs are compiled
GET /api/v1/worlds answers "which branch has a model?" in a single call.
The type name or property name does not match#
Symptom: a query returns nothing, or a column comes back empty, and the type or property does exist.
Names are matched exactly, including case: Pump is not pump, and Speed is not speed. A type or relationship name in a MATCH pattern that matches nothing is an error, Unknown label or Unknown relationship type under Query.SemanticError, so an empty result means the names resolved and the rows are genuinely absent. A property name that matches nothing returns an empty column rather than an error, and a WHERE n:Type predicate with an unknown type filters every row out.
Two names worth knowing:
- The universal display name is
.Label, with a capital L. - A property fed by a connector is a three-part value. Reading
n.Speedgives you the reading, its timestamp and its quality together. The number isn.Speed.Value.
List what is actually there:
MATCH (n)
RETURN DISTINCT labels(n) AS Type, count(n) AS Count
ORDER BY Count DESC
Both return full internal addresses, such as urn:atlas:ontology:lonestar-plant:Plant. In your own MATCH, use the last segment after the final colon, so that becomes MATCH (n:Plant).
One domain stays uncompiled after a restart#
Symptom: after an Atlas restart, most domains work but one keeps returning Query.NotCompiled.
Atlas recompiles every domain it has a record of at startup, in the background, while continuing to serve traffic. Domains become queryable one at a time as each recompile lands, so a brief Query.NotCompiled immediately after a restart clears itself.
Domains bound to a connector are compiled when their connector registers rather than at startup, so a domain waits until its connector is online.
| What you see | What it means |
|---|---|
Query.NotCompiled shortly after a restart, then it clears |
Normal - the background recompile had not reached that domain yet. A large estate takes longer to work through than a handful of domains. |
Query.NotCompiled on a domain bound to a connector |
The connector has not registered. Start with the connector. |
Check the connectors:
GET /api/v1/connectors
Each entry gives you connectorId (the stable identity, such as conn.historian), displayName, datasourceCount and registeredAt. The transportId field is the current live connection id and changes on every reconnect, so use connectorId for identity.
The query returns rows you did not expect#
These are the rules that decide which rows come back. Each one parses cleanly and returns HTTP 200, so if your query runs but the numbers are not what you expect, start here.
A type on the far end of an arrow filters that node#
A type written on any node of a pattern filters that node, not only the first one:
MATCH (line:Line)-[:contains]->(p:Pump) -- returns only the pumps
RETURN line.Label AS Line, p.Label AS Pump
The match understands type inheritance, so it also matches anything defined as a kind of Pump. On a variable-length pattern such as (root)-[:contains*1..8]->(p:Pump), the type applies to the final node only; the nodes in between are not constrained. shortestPath applies the types at both ends. Earlier 2.0 builds applied only the type on the start node; if a type on the far end of an arrow is ignored, you are on one of them.
Ask Gage
Ask the
graph-queryagent: "List the pumps on each line, and explain how the Pump type narrows the result."It returns the query with the type on the pump node and explains what the type matches.
An inline map is an equality on each key#
MATCH (p:Pump {Label: 'P-001'}) and MATCH (p:Pump) WHERE p.Label = 'P-001' are the same query. A map with several keys requires all of them, and it combines with any WHERE you also write. Two things to know:
- A bound property is a compound, so
{Speed: 42}compares the whole three-part value and matches nothing. Name the part with a dotted key,{Speed.Value: 42}, or writeWHERE p.Speed.Value = 42. - Anything other than equality, such as
>orSTARTS WITH, goes inWHERE.
Earlier 2.0 builds dropped inline maps and returned the unfiltered rows; if a map has no effect, you are on one of them.
Use labels(n) without a subscript#
labels(n) returns a single-element list, which is readable as-is:
MATCH (n)
RETURN DISTINCT labels(n) AS Type, count(n) AS Count
ORDER BY Count DESC
List indexing and slicing, such as labels(n)[0], are not part of Atlas Cypher. Read the last segment of the address you see.
Matching a type also returns everything beneath it#
MATCH (n:Equipment) matches Equipment and every type defined as a kind of Equipment - pumps, tanks, motors. This is usually what you want, and it is the most likely reason a count is higher than you expected.
To work with the parent type alone, return labels(n) alongside your rows and select the exact type in whatever reads the result.
More than one label on a node requires all of them#
MATCH (n:Machine:Active) returns only nodes that are both Machine and Active. It is the same query as:
MATCH (n:Machine) WHERE n:Active
Write the full address when a short name is ambiguous#
Atlas resolves a type name by trying the full address first, then matching on the last segment. If two scopes in your model declare the same local name, write the complete address in the pattern:
MATCH (n:`urn:atlas:ontology:{scope}:{Name}`)
The same applies to property names. On a pattern that carries a type, a short property name is resolved against that type's own hierarchy. On an untyped pattern such as MATCH (n), there is no type to scope against, so put a type on the pattern whenever you read properties.
Deduplicating a collected list#
count(DISTINCT ...) removes duplicates. For a distinct list from collect(), deduplicate outside the query or structure the match so duplicates do not enter the collection.
Sort a UNION result outside the query#
ORDER BY, SKIP and LIMIT after a UNION apply to each branch, and the branches are then stacked. Sort and page the combined result in whatever consumes it.
Write the depth on a variable-length traversal#
[:contains*] walks to a depth of 10 by default, and 50 is the maximum. Write the depth you need explicitly:
MATCH (plant:Plant)-[:contains*1..15]->(child)
RETURN plant.Label, count(child) AS Descendants
Anchor a regular expression#
=~ matches anywhere in the string, so WHERE n.Label =~ 'P-[0-9]{3}' also matches SUMP-9999 and P-12345. Anchor it with ^ and $, or use STARTS WITH, ENDS WITH or CONTAINS.
Use a decimal when calculating a percentage#
Whole number divided by whole number gives a whole number, so Volume / Capacity * 100 turns 450 out of 1000 into 0. Multiply before you divide, and use a decimal:
RETURN n.Volume.Value * 100.0 / n.Capacity AS PercentFull
Dividing by zero produces an empty value, and that row is not returned.
The durable identifier is entityId#
MATCH (n:Pump)
RETURN n.Label AS Pump, n.entityId AS Id, n.typeId AS Type
entityId is the stable handle and typeId is the type's full address. id(n) is a positional number that changes on every compile, so use entityId in anything you store.
Reading a live value#
An unsampled value reads as null#
A property that has not yet received a sample holds no value, so each of its fields reads as null:
| Field | What an unsampled property reads |
|---|---|
Value (a number) |
null |
Timestamp |
null |
Quality |
null |
A written zero is a value and reads as 0 or 0.0, so null and zero are different things. Return the fields alongside each other:
MATCH (n:Pump)
RETURN n.Label AS Pump,
n.FlowRate.Value AS Flow,
n.FlowRate.Timestamp AS ReadAt,
n.FlowRate.Quality AS Quality
ORDER BY ReadAt
Rows with a null ReadAt sort to the end of the list, and they are the ones waiting for their first reading. To list only those, filter on the property:
MATCH (n:Pump)
WHERE n.FlowRate IS NULL
RETURN n.Label AS Pump
A compound property that has never received a sample is null as a whole. Once any field holds a value it is a three-part value again, so to find a null value field in particular, test the field: WHERE n.FlowRate.Value IS NULL. Aggregates such as avg, sum, count, min and max ignore null cells.
The three states:
| What you see | What it means | What to do |
|---|---|---|
| A real value, a recent timestamp, quality 192 | Working normally. Quality 192 is the code for Good. | Nothing. |
| Null value, timestamp and quality | Subscribed, and the first sample has not arrived. The tag may be offline, the connector may be down, or the subscription may have only just started. | Check GET /api/v1/connectors, then the source system. |
| An old but real timestamp | The subscription delivered and then stopped. | Check the connector and the tag at source. |
| An empty column | A name is not matching. | See The type name or property name does not match. Most often n.Speed where n.Speed.Value was intended. |
Check the value without writing Cypher:
GET /api/v1/branches/{branch}/domains/{domain}/instances/{instanceId}/values
This returns a snapshot of one instance's property values at the moment you call it, which separates "is the value there?" from "is my query right?". It returns 400 if the domain is not compiled and 404 if the instance is not in the compiled model, so the status code distinguishes those two states.
Use UNWIND for historical values#
valueAt(n.Speed, ...) returns the property's current in-memory value. To read history, expand the property with UNWIND, which is the shape that reaches the data source:
MATCH (a:Agitator)
UNWIND a.Vibration AS v
WITH a, v
WHERE v.Timestamp >= datetime('2026-08-01T00:00:00Z')
RETURN a.Label AS Asset, v.Timestamp AS Time, v.Value AS Vibration
ORDER BY Time
valueAt() returns null in three cases: the timestamp could not be read (it accepts a whole number of ticks, a date-and-time value, or a parseable date string), the first argument does not resolve to an instance, or the property name did not resolve.
Historical values return no rows#
UNWIND over a connector-fed property fetches readings from the source, so it is the one query shape whose speed and results depend on a system outside Atlas.
| Symptom | Likely cause | What to do |
|---|---|---|
| Zero rows | The connector is not registered, or the source has no data in that window | Check GET /api/v1/connectors first, then widen the window. |
A syntax error on the WHERE |
WHERE cannot directly follow UNWIND |
Insert a WITH: UNWIND a.Vibration AS v WITH a, v WHERE ... |
| One reading stamped before the start of your window | Atlas carries the last known reading into the window so a value is defined at its start | Trim it in your report if your calculation cannot accommodate it. |
| More readings than the window should contain, around a date where the property's configuration changed | A window spanning a configuration change is answered in segments, one per configuration, stitched together on the time axis | Check whether the overlap matters for your calculation. |
| Rows are not in time order | Sources return rows in their own order | Add ORDER BY on the time column. |
| A slow query | The whole window is being fetched from the source | Narrow the window, or add a LIMIT while you are exploring. |
Use datetime('2026-08-01T00:00:00Z') for a fixed point and relative('-24h') for a rolling window. Both are covered in Querying with Cypher.
Diagnostic queries#
What types exist, and how many of each:
MATCH (n)
RETURN DISTINCT labels(n) AS Type, count(n) AS Count
ORDER BY Count DESC
What relationships exist, and how many of each:
MATCH ()-[r]->()
RETURN DISTINCT type(r) AS Relationship, count(r) AS Count
ORDER BY Count DESC
What properties a type has:
MATCH (n:Pump)
RETURN keys(n) AS Properties
LIMIT 1
Total instance count, as a check against the compile result:
MATCH (n) RETURN count(n) AS Total
Which instances are waiting for their first sample:
MATCH (n:Pump)
RETURN n.Label AS Pump,
n.FlowRate.Value AS Flow,
n.FlowRate.Timestamp AS ReadAt
ORDER BY ReadAt
Rows with a null timestamp at the end of the list have not received data yet.
Ask Gage
Ask the
graph-queryagent: "Find every pump property across my domain with a year-1 timestamp, and group them by source. Which bindings or connectors have not sent their first reading?"It separates properties waiting for a first sample from genuine zero readings, and points you at the source to check.
What is directly under something:
MATCH (p:Pump)<-[:contains]-(parent)
RETURN parent.Label AS Parent, p.Label AS Pump
ORDER BY Parent
Diagnostic API calls#
All of these need a Timebase Pulse bearer token.
| Call | Answers |
|---|---|
GET /api/v1/branches/{branch}/domains/{domain}/world |
Is the compiled model current? (isStale) How big is it? |
GET /api/v1/worlds |
Which branch and domain pairs are compiled? |
GET /api/v1/branches |
What branches exist? |
GET /api/v1/branches/{branch}/domains/{domain}/validation |
What is outstanding on the model, without compiling. |
GET /api/v1/branches/{branch}/draft |
Do I have unpublished work? |
POST /api/v1/branches/{branch}/draft/publish |
Move that work onto the branch. |
PUT /api/v1/branches/{branch}/domains/{domain}/world |
Compile. Idempotent and safe to repeat. |
GET /api/v1/connectors |
Is the connector registered right now? |
GET /api/v1/branches/{branch}/domains/{domain}/instances/{instanceId}/values |
Is the value there, independently of my query? |
Quick reference#
| Symptom | Cause | Fix |
|---|---|---|
Domain '<x>' ... has not been compiled |
No compiled model on this branch | PUT .../world, or select Compile on the domain's Overview |
Compile returns 422 with violations[] |
One or more Error violations | GET .../validation, clear every Error, compile again. See Validation Rules Reference |
| Saved and compiled, and the query is unchanged | The work is in your draft session | GET .../draft, then POST .../draft/publish, then compile |
| Response body is HTML | Missing token, or a URL outside the API surface | Send a Pulse bearer token; check the route |
Syntax error at line 1:24 - ... |
Typo, or a clause outside the supported set | Go to that line and character |
<CLAUSE> clauses are not supported |
Atlas Cypher is a read language | Change the model through the interface or the write API |
Function '<name>' is not supported |
The function is outside the supported set | For coalesce, use CASE WHEN x IS NULL THEN ... ELSE x END |
Variable "x" is not defined |
Used before a clause introduced it, often after a WITH |
Carry the variable through the WITH |
Unknown label '<name>' / Unknown relationship type '<name>' |
A MATCH pattern names a type the compiled model does not have |
Check the spelling and case against the diagnostic queries, or compile if the type is new |
All UNION branches must return the same number of columns |
Column counts differ | Match the counts |
| A type-name column holds a one-element list | labels() returns a list |
Use labels(n) and read the last segment |
| A count is higher than expected | Matching a type also matches everything beneath it | Return labels(n) and select the exact type outside the query |
A UNION result is out of order |
ORDER BY applies per branch |
Sort in whatever reads the result |
| A deep rollup is short | A bare * walks to the 100-hop engine ceiling; a bound above it is refused, not clamped |
Write the depth you need: *1..15 |
A percentage is 0 on every row |
Whole-number division truncates | Multiply by 100.0 before dividing |
| A column is empty | Wrong name, wrong case, or the whole three-part value | .Label not .name; n.Speed.Value not n.Speed |
| A value, timestamp and quality read null | No sample has arrived yet | Test the property, WHERE n.FlowRate IS NULL, or one field, WHERE n.FlowRate.Value IS NULL. Then check GET /api/v1/connectors |
| One domain stays uncompiled after a restart | Its connector has not registered | Check GET /api/v1/connectors |
Related articles#
- Querying with Cypher - what the language supports, where you run a query, and the ready-made patterns. Read this first if you are still writing the query.
- Validation Rules Reference - every validation rule ID, its message, and how to clear it. Read this when a compile returns 422.