neo4j загрузить csv - какая-то часть не работает
У меня проблема с импортом из CSV.
я запускаю следующее в оболочке, и последняя часть (MERGE (e1)-[:NEXT]->(hit))))
никогда не бывает немного расстраивает...
Каждая сессия имеет х хитов. Я хочу найти последний попадание вставленной сессии и связать его с новым попаданием с помощью отношения NEXT
Образец ПСВ:
Session_id | date_time Xxx | 2015-01-01T01: 00: 00 Xxx | 2015-02-02T09: 00: 00 Yyy | 2015-03-03T06: 00: 44
Код:
USING PERIODIC COMMIT 100
LOAD CSV WITH HEADERS FROM 'file:///home/xxx.csv' AS line FIELDTERMINATOR '|'
MERGE (session :Session { session_id:line.session_id })
MERGE (hit:Hit{date:line.date_time})
//........ Еще слияния......
//связи
CREATE (hit)-[:IN_SESSION]->(session)
CREATE ....//more relations
WITH session
MATCH (prev_hit:Hit)-[:IN_SESSION]->(session)
WITH prev_hit ORDER BY prev_hit.date_time DESC LIMIT 2
WITH collect(prev_hit) as entries
FOREACH(i in RANGE(0, length(entries)-1) |
FOREACH(e1 in [entries[i]] |
MERGE (e1)-[:NEXT]->(hit)))
1 ответ
Я не вижу, чего вы пытаетесь достичь с помощью вложенного FOREACH
петли.
Если вы действительно получаете оба hit
узел и session
узел, простой MERGE
все должно быть в порядке. Я думаю, что вы должны включить hit
в WITH
заявление хотя.
MERGE (session :Session { id: "xxx" })
MERGE (hit:Hit { date_time:"2015-04-03T06:00:44" })
CREATE (hit)-[:IN_SESSION]->(session)
WITH session, hit
MATCH (prev_hit:Hit)-[:IN_SESSION]->(session)
WHERE prev_hit <> hit // make sure that you only match other hits
WITH hit, prev_hit
ORDER BY prev_hit.date_time DESC LIMIT 1
MERGE (prev_hit)-[:NEXT]->(hit) // create relationship between the two
Обновить
Я обновил запрос, чтобы соответствовать prev_hit
которые не являются текущим хитом. Приведенный выше запрос работает так, как вы хотите, то есть он создает один NEXT
отношение к одному Hit
узел, связанный с тем же Session
, Смотрите здесь: http://console.neo4j.org/?id=ov7mer
Там могут быть проблемы с date_time. Я думаю, вы сохраняете это как строку, сортировка не всегда дает ожидаемый результат.
Обновление 2
Относительно вашего второго комментария: Если вы перебираете свой файл построчно и добавляете Hit
узлы, вы можете только добавить отношения к Hit
узлы, которые уже были добавлены. Если вы хотите непрерывную цепочку NEXT
отношения между Hit
узлы, вы можете сделать это только в одном запросе, если вы уверены, что записи вашего CSV-файла упорядочены по возрастанию по дате / времени.
Вы можете добавить NEXT
отношения между Hit
узлы позже, как описано здесь: http://www.markhneedham.com/blog/2014/04/19/neo4j-cypher-creating-relationships-between-a-collection-of-nodes-invalid-input/
Начните ваш запрос с:
MATCH (s:Session)--(hit:Hit)
// first order by hit.date_time
WITH DISTINCT s, hit ORDER BY hit.date_time DESC
// this will return one row per session with the hits in a collection
WITH s, collect(hit) AS this_session_hits
// try this to check the ordering:
// RETURN s.session_id, this_session_hits
// the following queries will be done on each row, this is like iterating over the sessions
FOREACH(i in RANGE(0, length(this_session_hits)-2) |
FOREACH(e1 in [this_session_hits[i]] |
FOREACH(e2 in [this_session_hits[i+1]] |
MERGE (e1)-[:NEXT]->(e2))))
Окончательный ответ;)
Этот запрос работает с набором данных в консоли neo4j ( http://console.neo4j.org/?id=mginka). Соединяет все Hit
из сеанса с NEXT
отношения.
MATCH (s:Session)<--(hit:Hit)
WITH DISTINCT s, hit
ORDER BY hit.date_time ASC
WITH s, collect(hit) AS this_session_hits
FOREACH (i IN RANGE(0, length(this_session_hits)-2)|
FOREACH (e1 IN [this_session_hits[i]]|
FOREACH (e2 IN [this_session_hits[i+1]]|
MERGE (e1)-[:NEXT]->(e2))))