Разъяснение нескольких шаблонов MATCH в запросе Cypher

В приведенном ниже запросе выполняется ли второй шаблон совпадения john-[r?:HAS_SEEN]->(movie) с результатом первого совпадения john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie) . Я пытаюсь понять, похоже ли это на концепцию канала unix, т.е. результат 1-го шаблона является входом для 2-го шаблона.

start john=node(1)
match
john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie),
john-[r?:HAS_SEEN]->(movie)
where r is null
return movie;

person Aravind Yarram    schedule 09.05.2013    source источник


Ответы (2)


Я не думаю, что стал бы сравнивать несколько предложений MATCH с концепцией каналов UNIX. Использование нескольких совпадений, разделенных запятыми, — это всего лишь способ вырваться из одномерного ограничения записи отношений с помощью одного предложения. Например, следующее полностью справедливо:

MATCH a--b, 
      b--c, 
      c--d, 
      d--e,
      a--c

В самом конце я вернулся и сослался на a и c, несмотря на то, что они не использовались в предложении непосредственно раньше. Опять же, это всего лишь способ изобразить двухмерные отношения, используя только одномерные предложения. Мы рисуем двумерную картинку из нескольких одномерных частей.

Кстати, я бы сравнил предложение WITH с каналами UNIX — я бы назвал их аналогичными. WITH передаст любые найденные результаты в следующий набор предложений, которые вы ему дадите.

person ean5533    schedule 09.05.2013
comment
Итак, как бы вы прочитали предложение MATCH. a--b И b--c И c--d И d--e И a--c? Путаница это. Запрос, который я упомянул в своем посте, должен возвращать все фильмы, которые смотрели друзья Джона, но которые не видел я. Было бы хорошо, если бы вы могли объяснить, как интерпретировать ваш пример - person Aravind Yarram; 10.05.2013
comment
Можешь и так читать, если хочешь. Семантически нет разницы между a--b--c и a--b, b--c. Они означают одно и то же: а относится к b, а be относится к c. Единственное синтаксическое отличие состоит в том, что первый объединяет два факта в одно предложение. Часто это разумный подход, потому что часто вы путешествуете по одному неветвящемуся пути; однако, если вам нужно разветвляться в двух направлениях, вы не можете сделать это в одну линию, поэтому вместо этого используйте две линии. - person ean5533; 10.05.2013
comment
И чтобы ответить на ваш другой вопрос, да, ваш запрос выглядит правильным для фильмов, которые видели друзья Джона, но не видел Джон. Если вы не получаете ожидаемых результатов, вы можете попробовать разместить образец набора данных на console.neo4j.org и позволить нам попробовать его. В качестве альтернативы вы можете попробовать удалить вторую часть вашего MATCH и удалить предложение WHERE и заменить их оба следующим: WHERE not(john-[:HAS_SEEN]->(movie)) - person ean5533; 10.05.2013
comment
В вашем примере есть две ветки, которым вы пытаетесь сопоставить правильные a-b-c-d-e и a-c. - person Aravind Yarram; 10.05.2013
comment
Да, и вы могли бы написать это как a--b--c--d--e, a--c и получить то же самое - person ean5533; 10.05.2013

Да, просто считайте эти два совпадения одним, т.е.

match (movie)<-[r?:HAS_SEEN]-john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)

or

match john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie)<-[r?:HAS_SEEN]-john
person Gopi    schedule 09.05.2013