I want to model a system as a graph. I'm starting small; I just want to model the power flow. So I created this graph:
CREATE (n:World {name:"Power", provides:"power"});
CREATE (n:System {name:"Connector", carries:"power"});
CREATE (n:System {name:"Power Supply", consumes:"power"});
MATCH (x:World {name:"Power"}), (y:System {name:"Connector"}) MERGE (x)-[:power {carries:"power"}]->(y);
MATCH (x:System {name:"Connector"}), (y:System {name:"Power Supply"}) MERGE (x)-[:power {carries:"power"}]->(y);
Now I want to know if the "Power Supply" (which consumes power), is actually connected via edges (which must carry power) and nodes (which also must carry power) to a node that provides power.
My first try went something like this:
MATCH (x {provides:'power'})-[{carries:"power"}]->(y {carries:"power"})-[{carries:"power"}]->(z {consumes:"power"}) RETURN x,y,z
But that only works because there are 3 nodes. If there were 4 it would not work. Example:
CREATE (n:World {name:"Power", provides:"power"});
CREATE (n:World {name:"Cable", carries:"power"});
CREATE (n:System {name:"Connector", carries:"power"});
CREATE (n:System {name:"Power Supply", consumes:"power"});
MATCH (x:World {name:"Power"}), (y:World {name:"Cable"}) MERGE (x)-[:power {carries:"power"}]->(y);
MATCH (x:World {name:"Cable"}), (y:System {name:"Connector"}) MERGE (x)-[:power {carries:"power"}]->(y);
MATCH (x:System {name:"Connector"}), (y:System {name:"Power Supply"}) MERGE (x)-[:power {carries:"power"}]->(y);
So my question is: How do I get the "(y {carries:"power"})-[{carries:"power"}]->" part to repeat until it finds a consumes power node?