#neo4j #cypher
#neo4j #cypher
Вопрос:
У меня есть связанные идентификаторы в формате csv.
Например :
ID, Associated_ID
1,2
3,4
8,1
2,100
100,100
8,101
200,200
Я хочу получить все связанные идентификаторы.
В этом случае ожидаемый результат:
[1,2,8,100,101]
[3,4]
[200]
load csv from 'file:///test/test.data' AS line
CREATE (:ids { mc: line[0], associated_mc:line[1]})
MERGE (m1:id {name: line[0]})
MERGE (m2:id {name: line[1]})
MERGE (m1)-[:SAME]->(m2);
MATCH p=(a)-[r:SAME*]-(b) RETURN p;
Ответ №1:
Вы создаете базу данных и извлекаете ее в одном запросе. Вы должны выполнить отдельные запросы для этих двух.
Вам не нужно писать CREATE при создании узлов, слияние сделает то же самое, избегая дубликатов. Таким образом, вы можете загружать данные с помощью следующего запроса:
LOAD CSV FROM 'file:///test/test.data' AS line
MERGE (m1:id {name: toInt(line[0])})
MERGE (m2:id {name: toInt(line[1])})
MERGE (m1)-[:SAME]->(m2);
И получите требуемый результат с помощью следующего запроса:
MATCH p=(start:id)-[:SAME*]->(end:id)
WHERE
NOT EXISTS ((end)-[:SAME]->())
AND
NOT EXISTS ((start)<-[:SAME]-())
return EXTRACT(node IN nodes(p) | node.name)
Если вы не поставите условие where, вы получите слишком много путей, из которых
часть других более длинных путей. Вы можете проверить результаты, удаливWHERE
условие
Комментарии:
1. Спасибо. Мне трудно понять предложение not exists. Похож ли он на тот, что в SQL? Я обновил образец данных в вопросе. Это решение, похоже, не работает для этого.
2. Это не сработало бы , если конечные узлы имеют отношения к самим себе, пути являются циклами. Вам нужно удалить
WHERE
условие в этом случае
Ответ №2:
Это сработало для меня —
MATCH (m:id)
CALL apoc.path.subgraphAll(m, {relationshipFilter:'SAME'}) YIELD nodes
with EXTRACT(node IN nodes | node.name) as ex_nodes
return distinct apoc.coll.sort(ex_nodes);