Предположим, у меня есть отношения со ссылками на себя:
(User)-[REPORTS_TO]->(User)
Как я могу написать шифр так, чтобы для каждого пользователя я возвращал строку для каждого пользователя, которая обозначает отчеты по происхождению для этого пользователя (произвольной глубины в цепочке управления)? То есть: если Джо отчитывается перед Джейн, а Джейн отчитывается перед Джоном, для MATCH на 'Joe' я бы получил в виде строки (разделитель здесь ',', но может быть любым):
Джо, Джейн, Джон
для Джейн это будет:
Джейн, Джон
а для Джона это будет:
Джон
(Альтернатива этому, когда одно поле будет содержать целевого пользователя, а другое будет содержать отчет о происхождении, также приветствуется)
Я бы не возражал против того, чтобы информация возвращалась в формате списка, но у меня возникают трудности с записью информации, ссылающейся на себя, в этот формат. Учитывая упрощенную схему, приведенную выше, когда пользователь сам ссылается на пользователя с этой взаимосвязью, как я могу записать рекурсивную взаимосвязь в список для каждого целевого пользователя через Cypher?
Возможный дубликат Простой рекурсивный запрос CYPHER
Да, этот шаблон шифра мне знаком. Однако каждая часть информации возвращается в отдельной строке относительно только одного целевого пользователя. Я хотел посмотреть, смогу ли я (в этом случае) сжать дерево друзей в один упорядоченный список / строку для каждого целевого пользователя.
Просто смени возврат на RETURN start, COLLECT(others)





Для этого вы можете либо вернуть коллекцию имен людей в цепочке:
MATCH path = (person:User)-[:REPORTS_TO*]->(top)
WHERE NOT (top)-[:REPORTS_TO]->()
RETURN person.name as name, [node in nodes(path) | node.name] as reportingChain
Или используйте Процедуры APOC, чтобы объединить элементы списка имен в строку:
MATCH path = (person:User)-[:REPORTS_TO*]->(top)
WHERE NOT (top)-[:REPORTS_TO]->()
WITH person.name as name, [node in nodes(path) | node.name] as reportingChain
RETURN name, apoc.text.join(reportingChain, ',') as reportingChainText
В общем, вы хотите преобразовать список
[joe, jane, john]в строку"joe, jane, john"?