---
title: nexyron.temporal_geo_dbscan_many
url: https://nexyron.tech/docs/cypher/procedures/temporal-and-streaming/nexyron-temporal-geo-dbscan-many
description: Cluster temporal geographic histories from many nodes together using DBSCAN.
---

# nexyron.temporal_geo_dbscan_many

## Generic Description

Cluster temporal geographic histories from many nodes together using DBSCAN.

Simple example:

```cypher
CALL nexyron.temporal_geo_dbscan_many([42, 43, 44], 'position', 0, 10000, 75.0, 3)
YIELD node_id, ts, lat, lon, cluster_id, is_noise
RETURN node_id, ts, lat, lon, cluster_id, is_noise
```

Temporal and streaming procedures inspect registered temporal history, rollups, time ranges, and global event timelines.

## Consumer-Level Explanation

Use this when the clustering question is shared across many entities rather than one subject at a time.

Typical examples:

-   cluster all couriers near one district during one hour
-   cluster all runner stop positions during one event window
-   find shared dense dwell zones across several devices

## Conceptual Explanation

This is the multi-subject companion to `nexyron.temporal_geo_dbscan`.

It still uses the same architecture:

1.  read temporal property history for each requested node
2.  normalize each value to a WGS84 point
3.  run one in-memory DBSCAN over the combined sample set
4.  return the cluster label plus the owning node for each sample

## More Detailed Explanation

In practical queries, start by deciding the row grain you want after the call: one row per node, one row per path, one row per registry object, one row per artifact, or one row per summary. Then keep that grain explicit with `YIELD` and named projections. That is the difference between a useful planner-facing example and a vague call that downstream tooling cannot safely compose. For contract-driven procedures, the executable examples on these pages intentionally inspect procedure metadata unless the required named artifacts are created in the same example.

## Advanced Example

```cypher
MATCH (r:Runner)
WHERE r.team = 'north'
WITH collect(id(r)) AS runner_ids
CALL nexyron.temporal_geo_dbscan_many(runner_ids, 'position', 1710000000000, 1710086400000, 60.0, 4)
YIELD node_id, ts, lat, lon, cluster_id, is_noise
RETURN node_id, ts, lat, lon, cluster_id, is_noise
ORDER BY ts, node_id
```

## Real Use Cases

-   discover shared hotspots across many moving entities
-   compare whether several users converged into the same dense area
-   build cluster-labeled temporal training rows across a cohort
-   compose the procedure output with `YIELD`, `WITH`, and `RETURN` rather than hiding follow-up logic outside Cypher

## Real Limitations And Tradeoffs

-   This is still bounded-window in-memory clustering, not a distributed geo analytics engine.
-   The caller chooses the node set explicitly.
-   It currently clusters WGS84 point data only.
-   procedure calls are explicit contracts; missing state, unsupported parameters, or absent artifacts should fail rather than silently falling back
