Hi Michael I have submitted a gist for approval, interestingly whilst writing it I found a better solution to the problem I was facing, would be great to get your thoughts on it and if there might be a tidier solution.
http://portal.graphgist.org/graph_gists/matching-against-multiple-nodes-with-restrictions-based-on-relationship-parameters Am I correct in thinking at the end of this, the doubled value in the sum(c3.amount) is because of bi-directional relationships? On Sunday, 17 September 2017 22:03:54 UTC+1, Michael Hunger wrote: > > Dave, do you think you could set up e.g. a graphgist with some sample data > and the different queries you've tried? > > That would make it much easier to help and try out alternative queries > > Micahel > > On Sun, Sep 17, 2017 at 12:39 AM, Dave Clissold <[email protected] > <javascript:>> wrote: > >> Ok have found the error with the first query >> >> MATCH (p1:Product {name: "P1"})-[c:CONTAINS]-(i:Ingredient) WITH collect( >> i.name) as i1 MATCH (p2:Product)-[:CONTAINS]-(i2) WITH p2, collect(i2. >> name) as matched, i1 WHERE ALL(x in i1 WHERE x in matched) return p2 >> >> I was not declaring the parameter name in the collect i2 >> >> Now to try and work out if there is a way of completing the 2nd query, is >> a FOREACH loop likely to work here? >> >> >> On Thursday, 14 September 2017 12:31:42 UTC+1, Dave Clissold wrote: >>> >>> Hi All >>> >>> >>> I am trying to match a product against multiple ingredients, the >>> returned node must contain all of the ingredients, sometimes there is a >>> quantity of how much of an ingredient is used. The number of ingredients >>> can change, so using an array is preferred, but this is part of an API >>> project being built in javascript so we can use FOR IN loops etc if it >>> makes things easier. As an example I've set up this in the console >>> http://console.neo4j.org/?id=39ead >>> >>> >>> I have 2 ways of querying that I cannot solve >>> >>> >>> *1.* >>> >>> >>> When running a WHERE IN query, like this one below >>> >>> >>> MATCH (p:Product)-[:CONTAINS]-(i:Ingredient) WHERE i.name IN['D','E','F' >>> ] RETURN p >>> >>> >>> It will treat the IN statement as an OR match against D, E or F and >>> return all :Products that contains these, in example (P1, P3, P4), is >>> there a way to declare this as AND, so the match is against D, E and F, so >>> that it only returns products that Contain all of these (P3, P4). I had >>> found this post on StackOverflow, >>> https://stackoverflow.com/questions/25939493/neo4j-match-multiple-destination-nodes >>> which >>> lead me to trying this query but it returns no rows >>> >>> MATCH (p1:Product {name: "P3"})-[c:CONTAINS]-(i:Ingredient) WITH collect >>> (i.name) as i1, c MATCH (b:Product)-[:CONTAINS]-(i2:Ingredients) WITH b, >>> i1, i2, c, collect(i2) as matched2 WHERE ALL(x IN i1 WHERE x in matched2 >>> ) RETURN b >>> >>> >>> *2.* >>> >>> >>> When there is a value of amount is there a way to run a similar query, >>> but also match a parameter from the relationship as below, >>> >>> >>> MATCH (p1:Product {name: "p2"})-[c1:CONTAINS]-(i1:Ingredient) >>> WITH c1 - 5 AS amountLow, c1 + 5 as amountHigh, i1 >>> MATCH (p2:Product)-[c2:CONTAINS]-(i2:Ingredient) WHERE i2.name = i1 AND >>> amountLow < c2.amount < amountHigh >>> >>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "Neo4j" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
