2016-08-04 3 views
0

Я изо всех сил пытаюсь сделать связанный список с выражением cypher. Я пытаюсь сделать следующее для каждого k. Связанный список и: NEXT отношения должны быть изолированы k.Создайте связанный список для всех узлов, подключенных узлом cypher

match (elem:Event)<-[r:HAS_EVENT]-(k) 
WITH elem ORDER BY elem.id ASC 
WITH COLLECT(elem) AS elems 
FOREACH (n IN RANGE(0, LENGTH(elems)-2) | 
FOREACH (prec IN [elems[n]] | 
FOREACH (next IN [elems[n+1]] | 
MERGE (prec)-[:NEXT]->(next)))) 

Поскольку подмигнули не представляется возможным сделать MATCH заявление внутри FOREACH заявления я попытался MATCH (а: Some_Label) с а х UNWIND х в к и другим возможным способам выполнения этого кода пути для каждых к (блокировка id и т. д.). Я всегда получаю длинную цепочку: NEXT throu all: узлы событий, предполагающие, что оператор соответствия учитывает все k узлов. Мне нужна помощь в том, как сопоставить: Some_Label узлы и передать каждый из них в код выше.

+0

Как ваши данные выглядят и кто является 'k'? Можете ли вы описать свою проблему проще или более подробно? –

+0

k - билет поддержки в этом случае. Поэтому я хочу создать связанный список для каждого билета. Каждый: Квесты событий содержат некоторые другие узлы, связанные с ним, статус, категоризацию и т. Д. Каждый: узел билета имеет несколько узлов: привязанные к нему узлы. : Ticket и: метки событий индексируются по id Проблема в том, что я хотел бы взять билеты (MATCH (k: Ticket), которые у меня есть на моем графике, и выполнить приведенный выше код для каждого k из предыдущего утверждения соответствия. В идеале из инструкции LOAD CSV, поскольку новые записи будут загружены таким образом, но это необязательно. –

+0

MATCH (a: Ticket) с --- SOMETHING --- match (elem: Event) <- [r: HAS_EVENT] - (k) С elem ORDER BY elem.id ASC WITH COLLECT (elem) AS elems FOREACH (n IN RANGE (0, LENGTH (elems) -2) | FOREACH (prec IN [elems [n]] | FOREACH (следующий IN [elems [n + 1 ]] | MERGE (prec) - [: NEXT] -> (next)))) –

ответ

0

Похоже, что есть две части. Во-первых, сопоставление только с k-узлами, которые вы хотите включить в связанный список (фильтрация, сортировка и т. Д.).

Как только у вас есть это, все, что вам нужно сделать, это СОБИРАТЬ их в список и использовать apoc.coll.pairs([list]) YIELD value. Это изменяет список на список пар каждого последовательного элемента ([[first, second], [second, third] ...]). Вам просто нужно следить за последней парой, которая является [последним, нулевым].

В этот момент все, что вам нужно сделать, это сделать FOREACH на каждом элементе (пару) и объединить ваши отношения: NEXT.

EDIT

Похоже, вы используете функцию периодической перебрать к элементам вы заинтересованы. Вы можете использовать функцию COLLECT() и пар(), чтобы заменить вложенные циклы Foreach.

+0

После этого выглядят проблемы с использованием пар, сгенерированных процедурой pairs() в FOREACH. [Эта ошибка] (https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/94) фиксирует проблему. – InverseFalcon

0

Я предполагаю, что вы хотите создать цепочку NEXT в списке Events. И каждый список Event происходит от MATCH до определенного узла k.

Я думаю, вы могли бы добиться этого с помощью всего лишь несколько иной WITH пункта с последующим шагом заказа:

MATCH (k:Ticket) // however you match here... 
WITH k 
// MATCH your k to Events 
MATCH (elem:Event)<-[r:HAS_EVENT]-(k) 
// include k in the WITH clause 
// now you have one result 'row' per k with the matching elem nodes 
WITH k, COLLECT(elem) AS elems 
// UNWIND, ORDER BY and collect() again to sort the list in each row 
UNWIND elems AS x 
WITH x ORDER BY x.id ASC 
WITH collect(x) AS ordered_elems_per_k 
// now the foreach should be applied for each k/list of elem pair 
FOREACH (n IN RANGE(0, LENGTH(ordered_elems_per_k)-2) | 
FOREACH (prec IN [ordered_elems_per_k[n]] | 
FOREACH (next IN [ordered_elems_per_k[n+1]] | 
MERGE (prec)-[:NEXT]->(next)))) 

Я думаю, что это не представляется возможным объединить ORDER BY и collect(). Это позволит решить вашу проблему более простым способом, но что-то в этом направлении должно работать.

0

Мне удалось решить эту проблему;

CALL apoc.periodic.iterate('Match (a:Ticket) return id(a) as id_p', 
'match (elem:Event)<-[r:HAS_EVENT]-(k) where id(k)={id_p} 
WITH elem ORDER BY elem.id ASC WITH COLLECT(elem) AS elems 
FOREACH (n IN RANGE(0, LENGTH(elems)-2) | 
FOREACH (prec IN [elems[n]] | 
FOREACH (next IN [elems[n+1]] | MERGE (prec)-[:NEXT]->(next))))', 
{batchSize:1000,parallel:true}) YIELD batches, total 
Смежные вопросы