Поиск ассоциаций с помощью Cypher

#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);