Сопоставьте узлы, в которых все отношения удовлетворяют ограничениям - PullRequest
0 голосов
/ 27 мая 2020

Я ищу узлы, у которых есть отношения, где все отношения удовлетворяют этому ограничению. точный пример: есть ли у вас отношение в списке.

график - это в основном коктейли, а отношения являются ингредиентами. учитывая список ингредиентов, я хочу знать, что я могу сделать.

with ['Sweet Vermouth', 'Gin', 'Campari', 'Bourbon'] as list
...
should return Negroni, Boulevardier, ...

Я обнаружил, что это сложно, потому что мы хотим убедиться, что все отношения узла удовлетворяют ограничению, но количество Узлы могут очень легко быть подмножеством списка, а не точно соответствовать списку ингредиентов.

это лучшее, что я сделал до сих пор, и он работает, только если у вас есть все ингредиенты, но ничего лишнего.

with ['Sweet Vermouth', 'Gin', 'Campari', 'Bourbon'] as list
MATCH (n:Cocktail)-[h:HAS]-(x)
WITH list, count(list) AS lth, n, COLLECT(DISTINCT x.name) AS cx, collect(DISTINCT h) as hh
WHERE ALL (i IN list WHERE i IN cx)
RETURN n

Я посмотрел на stackoverflow.com/ а / 62053139/974731. Я не думаю, что это решит мою проблему

enter image description here

, как вы можете видеть, добавление Бурбона удаляет негрони, чего не должно происходить, поскольку все мы Вот и все, что вам нужно сделать, это добавить ингредиент в наш батончик.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Это должно вернуть все коктейли, ингредиенты которых needed находятся в списке have.

WITH ['Sweet Vermouth', 'Gin', 'Campari', 'Bourbon'] as have
MATCH (c:Cocktail)-[:HAS]->(x)
WITH have, c, COLLECT(x.name) AS needed
WHERE ALL(n IN needed WHERE n IN have)
RETURN c

Или, если вы передадите have как параметр :

MATCH (c:Cocktail)-[:HAS]->(x)
WITH c, COLLECT(x.name) AS needed
WHERE ALL(n IN needed WHERE n IN $have)
RETURN c
0 голосов
/ 28 мая 2020

Ужасно взломано, но вот где я получил

with ['Sweet Vermouth', 'Gin', 'Campari', 'Bourbon'] as list
call {
  match (ali:Cocktail)--(ii:Ingredient) //pull all nodes
  return ali, count(ii) as needed // get count for needed ingredients
}
MATCH (ali)--(i:Ingredient)
WHERE i.name in list // get ingredients that are in the list

WITH distinct ali.name as name, count(ali.name) as available, needed
WHERE available = needed
RETURN name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...