Поиск ассоциаций с помощью Cypher - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть связанные идентификаторы в формате 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;

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Это сработало для меня -

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);
0 голосов
/ 22 апреля 2019

Вы создаете базу данных и извлекаете ее одним запросом. Вы должны выполнить отдельные запросы для этих двух.

Вам не нужно писать CREATE при создании узлов MERGE будет делать то же самое, избегая дублирования.Таким образом, вы можете загрузить данные с помощью следующего запроса :

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 условие

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