Изясняване на множество MATCH шаблони в Cypher заявка

В заявката по-долу вторият шаблон за съвпадение john-[r?:HAS_SEEN]->(movie) работи ли върху резултата от първото съвпадение john-[:IS_FRIEND_OF]->(user)-[:HAS_SEEN]->(movie). Опитвам се да разбера дали това е подобно на концепцията за unix pipe, т.е. резултатът от първия модел е входът към втория шаблон.

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, въпреки че те не бяха използвани в клаузата директно преди. Отново, това е само начин за начертаване на 2-измерни връзки, като се използват само едноизмерни изречения. Ние рисуваме двуизмерна картина с няколко едноизмерни парчета.

Като странична бележка, БИХ сравнил клаузата 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. Те означават едно и също нещо: a е свързано с 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