Graph Upgrade Overview and Compatibility
Overview
JupiterOne is upgrading the primary data stores used to process J1QL queries. The project is intended to improve query performance and reduce the time in which the latest data is available to query.
As part of this upgrade user will get access to an improved query experience, with a more responsive and configurable results page.
The upgrade involves some changes in behavior of queries and the results returned to the user. JupiterOne believes that each of these changes is towards more correct results.
New Search Experience
As part of the graph upgrade program JupiterOne is introducing an improved search experience and results table. Users will be able to get more value and a better experience when searching data in JupiterOne.

Increased Results Limits
The table will now show up to 250 results per page, with on-demand loading of additional pages. This allows the system to return the first page of query results to a user much faster in most cases.
The results table produces either a total row count, or an estimate for very large result sets. As you paginate through the pages the estimate becomes more refined, or becomes the absolute value.
Faster, more stable experience
The table component has been rebuilt to only render the section of the table visible to the user. This has made scrolling vertically and horizontally though large tables of results much more performant on the browser.
Column resizing, reordering, and left/right pinning
Columns can now be drag and dropped into a new ordering, with the ability to pin one or more columns to either the left or right side of the table. This makes understanding the data in the table much easier and more intuitive (1).
Quick column selection, including in Insights table widgets
Users can now much more quickly select which columns to show, including a column name search filter. Also includes the quick option to "Hide" a column without having to redo column selection.
Colors and Icons for Classes of Assets
Providing a more consistent and intuitive experience for users (2).
Stacked Icons for Graph Queries
When returning a graph query (i.e. a query with a traversal) and returning columns from multiple elements the icons to the left of the table show a stacked representation of the entity types (2), with a tool tip (3).
Query Compatibility and Results
The compatibility changes have been grouped into MAJOR, MEDIUM, and MINOR categories.
- MAJOR: Indicates a change in behavior that may significantly change query results
- MEDIUM: Covers changes where query results may change slightly, or previously invalid queries may now be rejected
- MINOR: Typically more style based changes, but might introduce incompatibility with downstream systems
API Pagination / Query Result Ordering MAJOR
In the legacy query service the same query on unchanged data, in some cases, would produce results with a stable order. This was not true for all queries, and should not be relied upon.
The new query engine produces results in any order and will frequently do so for the same query against unchanged data.
Paginating through query results using a cursor and VariableResultSize flag is always guaranteed to eventually return all results for a query.
For more details on this topic, and changes customers will need to make by 1st September 2024 please see the extended notes.
This change was originally classified as a MINOR change, but the impact has proven to be greater than expected. Customers using inappropriate API query calls are being proactively contacted to update their usage.
All JupiterOne provided clients / SDKs have been updated to use the appropriate options, please check you are using the latest clients.
Unwinding of Arrays MAJOR
Previously JupiterOne would "unwind" rows where the returned values contained arrays of values. This would introduce more results than expected in a lot of cases. The results are no longer unwound in this fashion.
- This may reduce the number of results in queries and alerts. The new number of rows better reflects the actual number of assets returned in your query
- Aggregations on properties with arrays no longer duplicates counts across rows
Using the following query as an example, where we have 461 aws_instances in the system:
FIND aws_instance AS i
RETURN COUNT(i) AS "Instance Count", i._integrationClass AS "Integration Class"
The legacy query service would return a table like so:
+----------------+---------------------+
| Instance Count | Integration Class |
|----------------|---------------------|
| 461 | CSP |
| 461 | Infrastructure |
+----------------+---------------------+
The upgraded query service will return this table:
+----------------+---------------------+
| Instance Count | Integration Class |
|----------------|---------------------|
| 461 | CSP, Infrastructure |
+----------------+---------------------+
The rationale here is that the sum of the aggregates should reflect the total number of assets, not the count of each individual property. This was particularly confusing in the legacy system where properties with array values were not clearly identified to the user and the number of rows, or aggregation results, did not match the total number of assets.
The way you search against these properties is not changed. The following query still returns all the results:
FIND aws_instance WITH _integrationClass = "CSP" AS i
RETURN COUNT(i) AS "Instance Count", i._integrationClass AS "Integration Class"
ORDER BY on returned columns only MEDIUM
Previously it was possible to order results by any property, even if that property was not in the returned columns. In the upgraded query system it is only possible to ORDER BY on properties that are returned in the results.
This query will still produce results, but the ordering will not be applied:
FIND aws_instance AS i
RETURN i.displayName, i.arn
ORDER BY i.accountId
The query should be written as:
FIND aws_instance AS i
RETURN i.displayName, i.arn, i.accountId
ORDER BY i.accountId
Aliasing a Negated Traversal MEDIUM
It was previously possible to alias a negated (do not match) traversal. This was confusing to users as the alias is to something that "does not exist". The results of such an alias, when included in a RETURN or aggregation, were undefined.
The following query will now produce an error. Note the negated traversal !RELATES:
FIND aws_instance AS i
THAT !RELATES TO DataStore AS ds
RETURN i.displayName, i.arn, ds.displayName, ds.arn
The error returned is Could not find node, relationship, or variable with identifier ds
Less De-duplication in Optional Traversals MEDIUM
Previously, optional traversals would de-duplicate traversal paths based on a collection of entities that were previously traversed. This would at times remove results that should have been included.
After the upgrade the system will not de-duplicate these matching paths. This is a more correct representation of the relationships in the graph as it shows all possible paths, although it is possible there will be more duplicated data in the results.
These effects can also be observed across multiple pages of results, they will not necessarily appear adjacent to each other in the table output.
The effect of this change can be reduced by including the UNIQUE keyword in queries.
Default Expression Names now more descriptive MEDIUM
Using an expression (aggregation, math operator, etc) in a RETURN without an AS alias would historically generate names such as expression0. This was unhelpful as it did not clearly indicate the source of the data. As part of the graph upgrade the expression names are now derived from the expression itself, when not aliased.
The legacy behavior:

New behavior:

This change may have an impact on any automation that expects the old expressionN format of un-aliased expressions.
RBAC Policy Filters no longer modify returned properties MEDIUM
It is possible in JupiterOne Enterprise RBAC access policies to filter what assets a user can query based on properties of those assets (e.g. limit a group of users to a specific AWS account by filtering on accountId), this is not being changed.
Additionally the system would strip non-matching property values from the returned entities based on these policies, the new system no longer does this.
Example: A user has an access filter that limits access to only entities with _class = Device. If this user searches in JupiterOne and we return an entity with _class = ['Device', 'Host'] historically the system would strip out the filtered property value, so the user would see the entity as having _class = ['Device'].
Having reviewed this feature it was determined this offered no meaningful security to the system and caused significant confusion when comparing entities between users with different RBAC policies.
Full Text Search Tokenization MEDIUM
Previously full text searches would tokenize the search string based on word boundaries, e.g: searching for "Keith Packard" would match an entity containing keith.packard@example.com. Alternatively, searching for "keith packard" would match Keith Packard.
The new query full text search functionality only supports case-insensitive “contains” searches. For example, if you search "Keith Packard", it now returns Keith Packard, keith packard, KEITH PACKARD, etc. It will NOT match things like keith.packard@example.com or Keith-Packard.
This simplification was made as analysis of full text search behavior indicated that only literal matches were desirable, rather than tokenized matches across all properties.
For more advanced text searching it is recommended to look at the new regex functionality in J1QL.
This change may have an impact on any Insights dashboards where the dashboard filters were applied as a free text search at the beginning of the query.