В вашем запросе на импорт CSV есть две ошибки.
Во-первых, вам нужно использовать тип, когда вы ОБЪЕДИНЯЕТЕ связь между узлами, в противном случае этот запрос не будет компилироваться. Вы, вероятно, поставили один и забыли добавить его, когда вставили его сюда.
Во-вторых, главное, что ваш запрос объединяет узлы с разными метками и разными свойствами, и это в основном отбрасывает его. Вы намеревались создать 3 узла с самым длинным путем, соединяющим их, но ваш запрос создает 4 узла, две изолированные группы по два узла в каждом:
Это создает 2 узла b: (:s {s:b})
и (:o {o:b})
. Каждый из них подключен к отдельному узлу, и это связано с тем, что узлы, создаваемые из каждой переменной в CSV, обрабатываются по-разному.
То, что вы должны делать, - это использовать одну и ту же метку и ключ свойства для всех задействованных узлов, и это позволит сопоставить узлу b ссылку только на один узел, а не создавать два:
LOAD CSV WITH HEADERS FROM "file:\\graphUnioned.csv" AS csvLine
MERGE (s:Node {value:csvLine.s})
MERGE (o:Node {value:csvLine.o})
MERGE (s)-[:REL]->(o)
RETURN *;
Вам также понадобится индекс для: Node (значение) (или любого другого эквивалента при импорте реальных данных), чтобы ваши MERGE и последующие MATCH были быстрыми при выполнении поиска узлов по свойству.
Теперь перейдем к самому длинному пути.
Если вы предполагаете, что начальный узел не имеет к нему отношения и что ваш конечный узел не имеет никаких связей с ним, вы можете использовать запрос, подобный следующему:
match (start:Node)
where not ()-->(start)
match p = (start)-[*]->(end)
where not (end)-->()
return p, length(p) as L
order by L desc
limit 1;