2013-08-30 3 views
1

Я пытаюсь построить график различных объектов, которые нравятся людям на Facebook, чтобы создать базовый механизм рекомендаций для перекрестных ссылок.neo4j (cypher) очень медленный

У меня есть данные для разных сущностей (фильмы, книги, музыка и т. Д.). Узлы создаются для каждого элемента со свойствами как имя элемента (имя фильма, книги и т. Д.) И тип сущности элемента (фильм, книга и т. Д.). Любые два узла имеют отношения между ними, называемые «сродство». Эта связь также обладает свойством «силы», которое равно no. людей, которым понравились эти два предмета.

Я использую пользователей FB для подключения этих узлов. Пользователи FB также являются узлами в графике со свойствами как имя человека и тип как человек. Связь между этими узлами и узлами элементов называется «любит». Теперь, если человеку понравился фильм, я хотел бы рекомендовать ему книги или музыку, пройдя график. Это ничтожество запрос я пытаюсь пройти график:

START root = node(<LIKED_MOVIE_NODE_ID>) 
MATCH p = root-[rel1:affinity*..3]-(movies)<-[rel2:likes]-(persons)-[rel3:likes]->(books) 
WHERE HAS(movies.type) and movies.type = "movies" and HAS(persons.type) and persons.type = "person" and HAS(books.type) and books.type = "books" 
RETURN books 

Это работает очень медленно, иногда принимая до 500 секунд. У меня есть 13000 фильмов, 2000 книг и 3000 музыкальных узлов. Подключение их - 16000 человек. Все вместе есть около 300 000 отношений.

Мои вопросы:

  1. я делаю что-то не так? Есть лучший способ сделать это? Я новичок в neo4j. Я пробовал некоторые из методов настройки neo4j graphDB. Я увеличил размер мини-кучи до 4 ГБ и запускаю его на 8-ядерном компьютере с 32 ГБ оперативной памяти.

  2. Я хочу знать силу отношений rel1 и числа rel2 и rel3. Rel1 обладает силой собственности. Я не смог это узнать,

Просьба сообщить, что я на грани отказа от neo4j и возврата к SQL. По крайней мере, это работает. :(

Regds, Paritosh

ответ

0

Cypher медленно. На самом деле очень медленно, когда по сравнению с обходом и основной API (http://java.dzone.com/articles/get-full-neo4j-power-using)

Тем не менее, вы могли бы попытаться ограничить количество узлов Neo4j процессов , разделив ваш Матч на разные предложения WITH. В зависимости от вашего usecase вы можете, например, положить root- [rel1: affinity * .. 3] - (фильмы) в отдельное предложение и отфильтровать отдельные фильмы. neo4j будет обрабатывать все комбинации путей, которые приводят к фильму.

PS:

WHERE HAS(movies.type) and movies.type = "movies" and HAS(persons.type) and persons.type = "person" and HAS(books.type) and books.type = "books" 

можно переписать в виде

WHERE movies.type! = "movies" and persons.type! = "person" and books.type! = "books" 

Или, если вы используете Neo4j 2.0.0M4 вы можете просто пропустить HAS()

Смежные вопросы