2014-12-12 4 views
2

У меня есть очень простая структура:Возвращающихся наиболее распространенные пути в Neo4j

U1-:VISITS->P1-:VISITS->P2-:VISITS->P3-VISITS->P4... 

Каждых ПОЕЗДКИ отношение имеет рейтинг по шкале от 1 до 10. Я заинтересован в отношениях, которые начинаются с U1-: VISITS-> P1-: VISITS-> P2, где 1-й рейтинг < 2, а второй рейтинг больше 5. Каждый узел страницы имеет ссылку на страницу как свойство. После этого меня интересуют следующие 2 страницы, которые посещает пользователь. Это должно возвращать список путей. Меня интересуют наиболее частые пути, которые пользователь принимает, и заказывая их количество раз, когда они появляются. Мой запрос не возвращает правильное количество путей. Что я сделал не так?

MATCH p=(a)-[r:VISITS]-(b)-[t:VISITS]-(c)-[q*1..2]-(page:Page) WHERE r.rating<2 AND t.rating>5 RETURN EXTRACT (n IN nodes(p)|n.page_id) ,count(p) ORDER BY count(p) DESC; 

Например:

U1->P1->P2 
U2->P1->P2 
U3->P3->P4 

должны иметь

P1,P2 2 
P3,P4 1 

в качестве конечного результата.

EDIT: Это мое решение, которое возвращает правильный результат для указанной задачи (u-> P1-> p2):

MATCH p=(a)-[r:VISITS]-(b:Page)-[t:VISITS]-(page:Page) WHERE r.rating<2 AND t.rating>5 WITH EXTRACT (n IN nodes(p)|n.page_id) AS my_pages,t AS rels RETURN DISTINCT(my_pages) AS pages,count(DISTINCT rels) as count; 

мне нужно, чтобы расширить его теперь включить длинные пути.

ответ

2

Первое, что я заметил (и оно сделало просто ошибкой транскрипции, заключается в том, что в отношениях нет указаний. Кроме того, вы не используете метки, поэтому вы можете быть сопоставлены в любом подразделе . пути Это может работать лучше:

MATCH p=(a:User)-[r:VISITS]->(b:Page)-[t:VISITS]->(c:Page)-[q*1..2]->(page:Page) 
    WHERE r.rating<2 AND t.rating>5 
    RETURN EXTRACT (n IN nodes(p)|n.page_id) ,count(p) 
    ORDER BY count(p) DESC; 

Если у вас нет этикетки, вы могли бы, возможно, также добавить WHERE NOT(()-[:VISITS]->(a))

+0

Да, по какой-то причине я не использовал направления, и это было одним из причины, по которым я не получил правильного результата. Вероятно, я не правильно объяснил исходный пост, но я рассчитываю подсчитать количество одинаковых путей, а не считать число узлов в пути. – user201411

+0

Hrmm, интересно. Может быть, 'RETURN count (DISTINCT p)'? –

+0

Я уточнил исходный вопрос. Я не хочу подсчитывать количество узлов, я пытаюсь вернуть счет различных путей. RETURN count (DISTINCT p) вернет 5, в то время как я ищу 3. Причина, по которой он возвращает 5, состоит в том, что он подсчитывает U1-> P1, а затем U1-> P1-> P2, тогда как он должен считать только U1- > P1-> P2 – user201411

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