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))))
Другие вопросы по тегам