Danice
Danice

Reputation: 23

Neo4j shortestPath cypher with a relation property

I have a database with nodes (Tiles) connected with relations (Connects). Both tiles and relations have a property called blocked. I would like to get a shortest path between 2 nodes without it containing a blocked node or relation. So when that blocked property is true, that node/relation is not to be used when finding a shortest path. The problem I am struggling with is at the relation when i try to filter them on that property.

For example when I try:

MATCH (node1:Tile {x :1, y :1, blocked:false}),(node2:Tile {x: 2, y: 4, blocked:false}),
p = shortestPath((node1)-[:Connects {blocked:false}]-(node2)) 
RETURN p

I get the error:

shortestPath(...) contains properties MapExpression(List((PropertyKeyName(blocked),False()))). This is currently not supported. (line 2, column 5 (offset: 93))
"p = shortestPath((node1)-[:Connects {blocked:false}]-(node2))"

So my question is: Did I get the cypher wrong, or am I really trying something that is not supported. And ofcourse, what would be the best solution to this puzzle?

Upvotes: 1

Views: 983

Answers (1)

Tim Kuehn
Tim Kuehn

Reputation: 3251

This should select all paths which have a "blocked" flag cleared. You'll probably want to tweak the [:Connects*] relationship to a reasonable limit.

MATCH (node1:Tile {x :1, y :1, blocked:false}),
      (node2:Tile {x: 2, y: 4, blocked:false}),
      p = shortestPath((node1)-[:Connects*]-(node2)) 
WHERE ALL (x IN RELATIONSHIPS(p) WHERE x.blocked = FALSE)
RETURN p

Upvotes: 3

Related Questions