I've put together a sample dataset to showcase this to make sure I understand your question. I believe you are wanting to get recipes that have at least all the same ingredients, meaning that the other recipe must have all the same ingredients as the Sweet Cake recipe but might have more ingredients as well.
CREATE (sweetcake:Recipe {name:'Sweet Cake'}),
(chocolatecake:Recipe {name:'Chocolate Cake'}),
(lemoncake:Recipe {name:'Lemon Cake'}),
(sugar:Ingredient {name:'Sugar'}),
(something:Ingredient {name:'Something Nice'}),
(milk:Ingredient {name:'Milk'}),
(chocolate:Ingredient {name:'Chocolate'}),
(lemon:Ingredient {name:'Lemon'}),
(sweetcake)-[:HAS_INGREDIENT]->(sugar),
(sweetcake)-[:HAS_INGREDIENT]->(something),
(sweetcake)-[:HAS_INGREDIENT]->(milk),
(chocolatecake)-[:HAS_INGREDIENT]->(sugar),
(chocolatecake)-[:HAS_INGREDIENT]->(something),
(chocolatecake)-[:HAS_INGREDIENT]->(milk),
(chocolatecake)-[:HAS_INGREDIENT]->(chocolate),
(lemoncake)-[:HAS_INGREDIENT]->(sugar),
(lemoncake)-[:HAS_INGREDIENT]->(milk),
(lemoncake)-[:HAS_INGREDIENT]->(lemon)
I am pretty sure you want Chocolate Cake to be returned, because it shares all of Sugar, Something Nice, and Milk with Sweet Cake. Lemon Cake shouldn't be returned, because it doesn't have Something Nice. So, use ALL()
to check that a recipe has at least all the same ingredients as the Sweet Cake recipe.
MATCH (:Recipe {name:'Sweet Cake'})-[:HAS_INGREDIENT]->(i:Ingredient)
WITH COLLECT(i) AS sweetcake_ingredients
MATCH (r:Recipe)-[:HAS_INGREDIENT]->(i:Ingredient)
WHERE r.name <> 'Sweet Cake'
WITH sweetcake_ingredients, r, COLLECT(i) AS other_ingredients
WHERE ALL(x IN sweetcake_ingredients WHERE x IN other_ingredients)
RETURN r.name
And only Chocolate Cake is returned.