Я пытаюсь создать запрос с использованием шифра, который «найдет» недостающие ингредиенты, которые могут быть у шеф-повара. Мой график настроен так:
(ingredient_value)-[:is_part_of]->(ingredient)
(ingredient)
будет иметь ключ / значение name = "dye colors". (ingredient_value)
может иметь ключ / значение value = "red" и "является частью" (ingredient, name="dye colors")
.
(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
Я использую этот запрос, чтобы получить все ingredients
, но не их фактические значения, которые требуются рецепту, но я хотел бы, чтобы возвращались только те ingredients
, которых нет у шеф-повара, вместо всех ингредиентов, требуемых для каждого рецепта. Я старался
(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef
но это ничего не вернуло.
Может ли это быть выполнено с помощью cypher / neo4j, или это то, что лучше всего сделать, вернув все ингредиенты и отсортировав их самостоятельно?
Бонус: также есть способ использовать шифр, чтобы сопоставить все значения, которые имеет повар, со всеми значениями, которые требует рецепт. До сих пор я возвращал только все частичные совпадения, которые возвращает a, chef-[:has_value]->ingredient_value<-[:requires_value]-recipe
и сам собираю результаты.
exists
вWHERE
предложении (а также отрицать его) neo4j.com/developer/subqueries/#existential-subqueries для получения дополнительной информации.Ответы:
Обновление 10.01.2013:
Обнаружил это в справочнике Neo4j 2.0 :
Старайтесь не использовать необязательные отношения. Превыше всего,
не используйте их так:
MATCH a-[r?:LOVES]->() WHERE r IS NULL
где вы просто убедитесь, что их не существует.Вместо этого сделайте так:
Использование шифра для проверки отсутствия связи:
? отметка делает отношения необязательными.
ИЛИ
В neo4j 2 выполните:
Теперь вы можете проверить наличие несуществующей (нулевой) связи.
источник
MATCH a...
Пример должен теперь бытьMATCH (a) WHERE NOT (a)-[:LOVES]->()
Для получения узлов, не имеющих отношения
Это хороший вариант проверить, существует ли связь.
Вы также можете проверить несколько условий для этого. Он вернет все узлы, которые не имеют отношения "сыграно" или "не сыграно".
Для получения узлов, не имеющих отношения к
Он проверит, что узел не имеет входящих / исходящих отношений.
источник
MATCH (player) WHERE NOT (player)-[r]-() RETURN player
дает Неопределенную ошибку переменной r . Как я могу определить r?(player -[:rel]- ()
), либо оставьте(player -[]- ()
MATCH (player) WHERE NOT (player)-[]-() RETURN player
- Работает нормальноЕсли вам нужна семантика «условного исключения», вы можете добиться этого таким образом.
Начиная с neo4j 2.2.1, вы можете использовать
OPTIONAL MATCH
предложение и отфильтроватьNULL
узлы unmatched ( ).Важно также , чтобы использовать
WITH
положение междуOPTIONAL MATCH
иWHERE
пунктами, так что первымWHERE
определяют условия для дополнительного матча , а второйWHERE
ведет себя как фильтр.Предположим, у нас есть 2 типа узлов:
Person
иCommunication
. Если я хочу получить всех лиц, которые никогда не общались по телефону, но могли общаться другими способами, я бы сделал следующий запрос:Шаблон совпадения будет соответствовать всем Лицам с их сообщениями, где
c
будетNULL
не телефонная связь. Затем фильтр (WHERE
послеWITH
) отфильтрует телефонную связь, оставив все остальные.Ссылки:
http://neo4j.com/docs/stable/query-optional-match.html#_introduction_3 http://java.dzone.com/articles/new-neo4j-optional
источник
Я написал суть, показывающую, как это можно сделать естественным образом с помощью Cypher 2.0.
http://gist.neo4j.org/?9171581
Ключевым моментом является использование необязательного сопоставления с доступными ингредиентами, а затем сравнение для фильтрации отсутствующих (нулевых) ингредиентов или ингредиентов с неправильным значением.
Обратите внимание, что это понятие декларативно и не требует описания алгоритма, вы просто записываете то, что вам нужно.
источник
Я выполнил эту задачу с помощью гремлина. я сделал
Это вернуло пути всех недостающих ингредиентов. Я не смог сформулировать это на языке шифрования, по крайней мере, для версии 1.7.
источник
Последний запрос должен быть:
Этот шаблон:
(ingredient)<-[:has_ingredient*0..0]-chef
Причина, по которой он ничего не вернул.
*0..0
означает, что длина отношений должна быть равна нулю, что означает, что ингредиент и повар должны быть одним и тем же узлом, а это не так.источник