Внешнее соединение SQL против шифра Neo4J

Я новичок в Neo4J Cipher, я знаю, что хочу получить в SQL, но не могу создать запрос в Cipher.

Пусть у нас есть 3 таблицы:

Pers(persId,name,workId,born)
Work(workId,name)
Friend(pers1Id,pers2Id)

Задача: найти людей, которые работают в одной компании и не являются друзьями, а разница в возрасте не превышает 5 лет. В SQL простой запрос выглядит следующим образом:

select * from Pers p1 join Pers p2 on p1.workId=p2.workId 
where not exists
(select 1 from Friend f where p1.persId in (f.person1Id,f.person2Id) 
and p2.persId in (f.person1Id,f.person2Id) ) 
and abs(p1.born-p2.born)<5

как насчет шифра Neo4J? Будем признательны за любую помощь, особенно в том, как переводить запросы SQL в Cipher. Мирек


person Miroslaw    schedule 13.10.2016    source источник
comment
Это помогает включить то, что вы пробовали до сих пор, даже если это не работает.   -  person InverseFalcon    schedule 14.10.2016


Ответы (2)


Предположим, у вас есть ярлыки :Person и :Workplace. Предположим, что такие отношения уже существуют:

(:Person)-[:WorksAt]->(:Workplace)
(:Person)-[:FriendsWith]->(:Person)

Ваш запрос Cypher будет выглядеть примерно так:

MATCH (p1:Person)-[:WorksAt]->()<-[:WorksAt]-(p2:Person)
WHERE NOT (p1)-[:FriendsWith]-(p2)
AND abs(p1.born-p2.born) < 5
RETURN p1, p2

Хотя имейте в виду, я думаю, что вы получите две строки на пару с переключением порядка (мы можем устранить это без особых проблем, если вам нужно).

В общем, хорошей идеей будет начертить диаграмму шаблона или запроса, и оттуда обычно несложно перевести ее в Cypher.

person InverseFalcon    schedule 13.10.2016

Как показывает ответ InverseFalcon, вы можете использовать конструкцию WHERE NOT <pattern> для выражения операции антисоединения (иногда называемой левым антиполусоединением).

Я только что закончил научную статью на эту тему — в настоящее время она находится на рецензировании, но она может помочь вам понять связь между реляционной алгеброй и шифром: http://docs.inf.mit.bme.hu/ingraph/pub/btw2017-opencypher.pdf

person Gabor Szarnyas    schedule 14.10.2016