I have the following graph as a Neo4j graph database:
activates
(80 °F)
(A)------------------------------------->(D)
| \__ _/->^
| \__ activates __/ |
| \__(50 °F) __/ |
| \__ __/ |
| \__ __/ |
activates | \__ __/ |
(50 °F) | \/ | activates
| __/\__ | (50 °F)
| activates __/ \__ |
| (60 °F)__/ \__ |
| __/ \__ |
| __/ \__ |
| __/ \_ |
v / \->|
(B)------------------------------------->(C)
activates
(50 °F)
Each relationship has a property denoting the required temperature for the 'activates' action.
I need to retrieve all the available paths between (A) and (D) WHERE the temperature is 50 °F along the path.
The output should include:
A -[:activates{temperature:'50'}]-> B -[:activates{temperature:'50'}]-> C -[:activates{temperature:'50'}]-> D
A -[:activates{temperature:'50'}]-> C -[:activates{temperature:'50'}]-> D
but not
A -[:activates{temperature:'80'}]-> D
A -[:activates{temperature:'50'}]-> B -[:activates{temperature:'60'}]-> D
How do I write the required Cypher query?
Thanks in advance.
Edit 1: I added another diagonal relationship (B -[:activates{temperature:'80'}]-> D) for more clarity.
Edit 2: I need to retrieve all the available paths between (A) and (D) WHERE the temperature is the same along the path, i.e: A -> B -> C -> D, A -> C -> D, A -> D.
START a=node({A}), d=node({D})
MATCH p=a-[r:ACTIVATES*..]-d
WHERE has(r.temperature) and r.temperature='50'
RETURN p;
substitute the values in the curved brackets (A,D) with their node IDs
update: using function all
START a=node(1), d=node(4)
MATCH p=a-[r:ACTIVATES*..]-d
WITH head(relationships(p))as r1,p //since the pointer r is a collection of rels we must declare a single relationship pointer
WHERE all(r2 in relationships(p)
where r2.temperature=r1.temperature)
return p;