Path & Algorithm Procedures
algo.allsimplepaths()
Find all simple paths (without repeated nodes) between two nodes.
Syntax: CALL algo.allsimplepaths(startNode, endNode, relTypes, maxDepth) YIELD path
Parameters:
| Parameter | Type | Description |
|---|---|---|
startNode |
Node |
Starting node |
endNode |
Node |
Target node |
relTypes |
String/List |
Relationship type(s) to traverse |
maxDepth |
Integer |
Maximum path length |
Returns: path - Each simple path found
APOC Compatible: apoc.algo.allSimplePaths
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CALL algo.allsimplepaths(a, b, 'KNOWS', 5) YIELD path
RETURN path
See reference/graph-algorithms/path-finding.adoc#algo-all-simple-paths in the Graph Algorithms appendix for full parameter reference and examples.
algo.astar()
Find the shortest path using A* algorithm with optional geographic heuristics.
Syntax: CALL algo.astar(startNode, endNode, relType, weightProperty, [latProperty], [lonProperty]) YIELD path, weight
Parameters:
| Parameter | Type | Description |
|---|---|---|
startNode |
Node |
Starting node |
endNode |
Node |
Target node |
relType |
String |
Relationship type to traverse |
weightProperty |
String |
Edge property to use as weight |
latProperty |
String |
Optional - Node property for latitude (for geographic heuristic) |
lonProperty |
String |
Optional - Node property for longitude (for geographic heuristic) |
Returns:
-
path- The shortest path -
weight- Total path weight
APOC Compatible: apoc.algo.aStar
MATCH (a:City {name: 'Seattle'}), (b:City {name: 'Miami'})
CALL algo.astar(a, b, 'FLIGHT', 'distance', 'lat', 'lon') YIELD path, weight
RETURN path, weight
See reference/graph-algorithms/path-finding.adoc#algo-astar in the Graph Algorithms appendix for full parameter reference and examples.
algo.dijkstra()
Find the shortest weighted path between two nodes using Dijkstra’s algorithm.
Syntax: CALL algo.dijkstra(startNode, endNode, relType, weightProperty, [direction]) YIELD path, weight
Parameters:
| Parameter | Type | Description |
|---|---|---|
startNode |
Node |
Starting node |
endNode |
Node |
Target node |
relType |
String |
Relationship type to traverse |
weightProperty |
String |
Edge property to use as weight |
direction |
String |
Optional - Traversal direction ("OUT", "IN", "BOTH", default: "BOTH") |
Returns:
-
path- The shortest path -
weight- Total path weight
APOC Compatible: apoc.algo.dijkstra
MATCH (a:City {name: 'New York'}), (b:City {name: 'Los Angeles'})
CALL algo.dijkstra(a, b, 'ROAD', 'distance') YIELD path, weight
RETURN path, weight
See reference/graph-algorithms/path-finding.adoc#algo-dijkstra in the Graph Algorithms appendix for full parameter reference and examples.
path.combine()
Combine two paths.
Syntax: path.combine(path1, path2)
Returns: Path - Combined path
APOC Compatible: apoc.path.combine
path.create()
Create a path from a list of nodes and relationships.
Syntax: path.create(node, [rel, node, …])
Returns: Path - Created path
APOC Compatible: apoc.path.create
path.elements()
Get all elements (nodes and relationships) of a path.
Syntax: path.elements(path)
Returns: List - List of nodes and relationships
APOC Compatible: apoc.path.elements
path.slice()
Get a slice of a path.
Syntax: path.slice(path, start, [end])
Returns: Path - Sliced path
APOC Compatible: apoc.path.slice
path.expand()
Expand paths from a starting node following relationship types and node labels.
Syntax: CALL path.expand(startNode, relTypes, labelFilter, minDepth, maxDepth) YIELD path
Parameters:
| Parameter | Type | Description |
|---|---|---|
startNode |
Node |
Starting node |
relTypes |
String |
Relationship types (pipe-separated, e.g., "KNOWS|WORKS_WITH") |
labelFilter |
String |
Node labels to include (pipe-separated) |
minDepth |
Integer |
Minimum path length (non-negative) |
maxDepth |
Integer |
Maximum path length |
Returns: path - Each expanded path
APOC Compatible: apoc.path.expand
MATCH (a:Person {name: 'Alice'})
CALL path.expand(a, 'KNOWS|WORKS_WITH', 'Person', 1, 3) YIELD path
RETURN path
path.expandconfig()
Expand paths using a configuration map for more control.
Syntax: CALL path.expandconfig(startNode, config) YIELD path
Configuration options:
| Option | Type | Description |
|---|---|---|
relationshipFilter |
String/List |
Relationship types |
labelFilter |
String/List |
Node labels |
minLevel |
Integer |
Minimum depth (default: 0) |
maxLevel |
Integer |
Maximum depth (default: unlimited) |
bfs |
Boolean |
Use BFS (true) or DFS (false) (default: true) |
limit |
Integer |
Maximum number of paths to return |
Returns: path - Each expanded path
APOC Compatible: apoc.path.expandConfig
MATCH (a:Person {name: 'Alice'})
CALL path.expandconfig(a, {
relationshipFilter: 'KNOWS|WORKS_WITH',
labelFilter: 'Person',
minLevel: 1,
maxLevel: 3,
bfs: true,
limit: 100
}) YIELD path
RETURN path
path.spanningtree()
Get a spanning tree from the start node to all reachable nodes.
Syntax: CALL path.spanningtree(startNode [, config]) YIELD path
Returns: path - Each path in the spanning tree
APOC Compatible: apoc.path.spanningTree
MATCH (root:Category {name: 'Root'})
CALL path.spanningtree(root, {relationshipFilter: 'HAS_CHILD', maxLevel: 5}) YIELD path
RETURN path
path.subgraphall()
Get all nodes and relationships reachable from a starting node.
Syntax: CALL path.subgraphall(startNode [, config]) YIELD nodes, relationships
Returns:
-
nodes- List of all reachable nodes -
relationships- List of all traversed relationships
APOC Compatible: apoc.path.subgraphAll
MATCH (a:Person {name: 'Alice'})
CALL path.subgraphall(a, {relationshipFilter: 'KNOWS', maxLevel: 2}) YIELD nodes, relationships
RETURN size(nodes) AS nodeCount, size(relationships) AS relCount
Yield only what you need. YIELD nodes on its own does not read a single edge record, while
YIELD nodes, relationships has to load one per relationship in the component. On a large component that is the
difference between a walk whose cost follows the number of nodes and one that follows the number of relationships.
|
nodes and relationships are returned in breadth-first order from the starting node. Before 26.10.1 the order was
unspecified and effectively arbitrary.
relationships only ever includes edges whose two endpoints are both in nodes, matching apoc.path.subgraphAll.
Before 26.10.1, a labelFilter that excluded a neighbour could still leave the edge reaching it in relationships,
even though that neighbour was missing from nodes.
path.subgraphnodes()
Get all nodes reachable from a starting node within configured constraints.
Syntax: CALL path.subgraphnodes(startNode [, config]) YIELD node
Returns: node - Each reachable node
APOC Compatible: apoc.path.subgraphNodes
MATCH (a:Person {name: 'Alice'})
CALL path.subgraphnodes(a, {relationshipFilter: 'KNOWS', maxLevel: 3}) YIELD node
RETURN node.name
| Nodes are returned in breadth-first order from the starting node. Before 26.10.1 the order was unspecified. |