Настройка производительности Neo4j

Я новичок в Neo4j. В настоящее время я пытаюсь создать сайт знакомств в качестве POC. У меня есть 4 ГБ входного файла, который выглядит как формат ниже.

Это содержит viewerId (мужской/женский), viewId, который представляет собой список идентификаторов, которые они просмотрели. Основываясь на этом файле истории, мне нужно дать рекомендацию, когда какой-либо пользователь выходит в сеть.

Входной файл:

viewerId   viewedId 
12345   123456,23456,987653 
23456   23456,123456,234567 
34567   234567,765678,987653 
:

Для этой задачи я попробовал следующий способ,

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:/home/hadoopuser/Neo-input " AS row
FIELDTERMINATOR '\t'
WITH row, split(row.viewedId, ",") AS viewedIds
UNWIND viewedIds AS viewedId
MERGE (p2:Persons2 {viewerId: row.viewerId})
MERGE (c2:Companies2 {viewedId: viewedId})
MERGE (p2)-[:Friends]->(c2)
MERGE (c2)-[:Sees]->(p2);

И запрос My Cypher для получения результата:

MATCH (p2:Persons2)-[r*1..3]->(c2: Companies2)
RETURN p2,r, COLLECT(DISTINCT c2) as friends 

Для выполнения этой задачи потребуется 3 дня.

Моя системная конфигурация:

Ubuntu -14.04  
RAM -24GB

Конфигурация Neo4j:
neo4j.properties:

neostore.nodestore.db.mapped_memory=200M
neostore.propertystore.db.mapped_memory=2300M
neostore.propertystore.db.arrays.mapped_memory=5M
neostore.propertystore.db.strings.mapped_memory=3200M
neostore.relationshipstore.db.mapped_memory=800M

neo4j-wrapper.conf

wrapper.java.initmemory=12000
wrapper.java.maxmemory=12000

Чтобы сократить время, я ищу и получаю одну идею в Интернете, например пакетный импортер, по следующей ссылке: https://github.com/jexp/batch-import

По той ссылке у них есть файлы node.csv, rels.csv, они импортированы в Neo4j. Я не понимаю, как они создают файлы node.csv и rels.csv, какие сценарии они используют и все такое.

Может ли кто-нибудь дать мне пример сценария для создания файлов node.csv и rels.csv для моих данных?

Или вы можете дать какие-либо предложения, чтобы ускорить импорт и извлечение данных?

Заранее спасибо.


person Karthick S    schedule 23.06.2015    source источник


Ответы (1)


Вам не нужна обратная зависимость, достаточно только одной!

Для импорта настройте вашу кучу (neo4j-wrapper.conf) на 12G, настройте кеш страницы (neo4j.properties) на 10G.

Попробуйте это, это должно быть сделано за несколько минут.

create constraint on (p:Persons2) assert p.viewerId is unique;
create constraint on (p:Companies2) assert p.viewedId is unique;

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:/home/hadoopuser/Neo-input " AS row
FIELDTERMINATOR '\t'
MERGE (p2:Persons2 {viewerId: row.viewerId});

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:/home/hadoopuser/Neo-input " AS row
FIELDTERMINATOR '\t'
FOREACH (viewedId IN split(row.viewedId, ",") |
  MERGE (c2:Companies2 {viewedId: viewedId}));

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:/home/hadoopuser/Neo-input " AS row
FIELDTERMINATOR '\t'
WITH row, split(row.viewedId, ",") AS viewedIds
MATCH (p2:Persons2 {viewerId: row.viewerId})
UNWIND viewedIds AS viewedId
MATCH (c2:Companies2 {viewedId: viewedId})
MERGE (p2)-[:Friends]->(c2);

Для слияния отношений, если у вас есть компании, которые имеют от сотен тысяч до миллионов просмотров, вы можете использовать это вместо этого:

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:/home/hadoopuser/Neo-input " AS row
FIELDTERMINATOR '\t'
WITH row, split(row.viewedId, ",") AS viewedIds
MATCH (p2:Persons2 {viewerId: row.viewerId})
UNWIND viewedIds AS viewedId
MATCH (c2:Companies2 {viewedId: viewedId})
WHERE shortestPath((p2)-[:Friends]->(c2)) IS NULL
CREATE (p2)-[:Friends]->(c2);

Что касается вашего запроса?

Чего вы хотите достичь, извлекая перекрестные продукты между всеми людьми и всеми компаниями на глубине до 3 уровней? Это могут быть триллионы путей?

Обычно вы хотите знать это для отдельного человека или компании.

Обновите свой запрос

Например. Для 123456, Лица, которые все просматривали эту компанию, 12345,23456, тогда какие компании просматривали эти лица 12345 123456,23456,987653 23456 23456,123456,234567, тогда мне нужно дать рекомендацию компании -123456 как 23456,987653, 23456,234567 Отличие от результата (окончательный результат) 23456,987653,234567

match (c:Companies2)<-[:Friends]-(p1:Persons2)-[:Friends]->(c2:Companies2)
where c.viewedId = 123456
return distinct c2.viewedId;

для всех компаний это может помочь:

match (c:Companies2)<-[:Friends]-(p1:Persons2)
with p1, collect(c) as companies
match (p1)-[:Friends]->(c2:Companies2)
return c2.viewedId, extract(c in companies | c.viewedId);
person Michael Hunger    schedule 23.06.2015
comment
Привет, Майкл, спасибо за ваш ответ. Я хочу дать рекомендацию для каждой компании, например, кто все просматривает эту компанию также просматривается. Например. Для 123456, Лица, которые все просматривали эту компанию, 12345,23456, тогда какие компании просматривали эти лица 12345 123456,23456,987653 23456 23456,123456,234567, тогда мне нужно дать рекомендацию компании -123456 как 23456,987653, 23456,234567 Отличительный результат(Конечный результат) 23456,987653,234567 вот так мне нужно дать рекомендации для каждой компании. Можете ли вы дать какие-либо предложения для этого? - person Karthick S; 24.06.2015
comment
Привет Майкл, Спасибо за ваше обновление. Я попробовал ваш запрос на обновление для получения данных. Для одного идентификатора компании я получаю результат. Но если я перейду к извлечению всех данных, я получаю ошибку пространства кучи. Я увеличил размер кучи до 24 ГБ в файле wrapper.conf. Тем не менее я получаю ту же ошибку. Как получить полные рекомендуемые данные для каждого идентификатора компании? Можете ли вы помочь мне решить эту проблему? - person Karthick S; 02.07.2015
comment
Вы создали индекс/ограничение для :Companies2(viewedId)? - person Michael Hunger; 03.07.2015
comment
Обновлен еще один пример запроса - person Michael Hunger; 03.07.2015
comment
Привет, Майкл. Спасибо за ваш обновленный запрос. Я создал ограничение и использовал то, что вы дали. Всего у меня 15 75 345 идентификаторов (человек, список просмотренных компаний). После того, как я импортировал это, было создано 32,23,433 узла и 17,79,75,432 отношения. До 1 00 000 идентификаторов Я получил идентификаторы результатов рекомендаций. Если я превыслю этот предел, например, 2 лакха или больше, я не получу никакого результата. Но эта работа выполняется более 4 дней и все еще выполняется. Можете ли вы дать мне несколько предложений по этой проблеме? Нужно ли мне изменять какие-либо файлы конфигурации Neo4j? - person Karthick S; 14.07.2015
comment
Возможно, вы можете отправить мне копию своей базы данных (в дропбоксе) и свои запросы еще раз Майклу на neo4j.com, чтобы посмотреть. - person Michael Hunger; 16.07.2015