2013-11-29 2 views
1

Я пытаюсь запросить узлы книги для рекомендации Cypher.
Я хочу порекомендовать A: Книга и C: Книга для A: Пользователь.
Мне жаль, что мне нужен график, чтобы объяснить этот вопрос, но я не мог отобразить графическое изображение, потому что у моего бонуса не хватает функции загрузки.
Я написал запрос ниже.Как запросить рекомендацию с использованием Cypher

match (u1:User{uid:'1003'})-->(o1:Order)-->(b1:Book)<--(o2:Order) 
     <--(u2:User)-->(o3:Order)-->(b2:Book) 
return b2 

Этот запрос возвращает все книги (A, B, C, D), передает уникальность Cypher's.
Я ожидаю, что вернусь только A: Книга и C: Книга.
Является ли это спецификацией Neo4j '?
Как мне получить ожидаемый доход? Всем спасибо.

среда: Neo4j ver.v2.0.0-RC1 Использование Neo4j сервера с REST API

+0

Вы можете поделиться образцовым графом, включив оператор create, который будет генерировать упомянутый граф, или создав его в консоли Neo4j и разместив ссылку в своем вопросе. Вот пример последнего: http://console.neo4j.org/r/fnnz6b – jjaderberg

+0

Благодарим вас за ответ. Я не знал этого удобного сайта. Я постараюсь поделиться некоторым графиком в ближайшее время. – Michael

+0

Мой график - это ссылка. http: //console.neo4j.org /? id = e242cm Пользователь может купить книгу за один раз. это означает, что заказ может содержать только одну книгу. – Michael

ответ

1

Без образца графика его трудно сказать, почему вы получите что-то назад, когда вы ожидали чего-то еще. Вы можете поделиться образцовым графом, включив оператор create, который будет генерировать упомянутый граф, или создав его в консоли Neo4j и разместив ссылку в своем вопросе. Вот пример последнего: console.neo4j.org/r/fnnz6b

А пока вы, вероятно, захотите объявить тип отношений в своем шаблоне. Если :User имеет более чем один тип исходящих отношений, вы будете исключать эти другие пути, основанные на ярлыках узлов на другом конце, что намного менее эффективно, чем для того, чтобы начать только правильные отношения.

На мой взгляд, неясно, означает ли, что (u:User)-->(o:Order)-->(b:Book) означает, что у пользователя один или несколько заказов, и каждый заказ состоит из одной или нескольких книг; или если это означает только то, что пользователь заказал книгу. Если вы можете поделиться образцом, надеюсь, это тоже будет ясно.

Edit:
Великий, так что, глядя на график: Вы получаете B и D назад, потому что другие, которые купили B также купили D, и другие, которые купили D также купили B, который является вашим критерием рекомендации. Вы можете добавить фильтр в операторе WHERE исключить те книги, которые пользователь уже купил, что-то вроде

WHERE NOT (u1)-[:BUY]->()-[:CONTAINS]->(b2) 

Это даст вам A, C, C обратно, так как есть две соответствующие пути к C. Это вероятно, не имеет значения, чтобы получить два результата элементы для C, так что вы можете либо ограничить возврат дать только отдельных значений

RETURN DISTINCT(b2) 

или группы возвращаемых значений путем подсчета путей, соответствующих каждому результату, как «рекомендация счет»

RETURN b2, COUNT(b2) as score 

Кроме того, если каждый заказ только [CONTAINS] одна книга, вы можете попробовать моделирование без заказа, просто (:User)-[:BOUGHT]->(:Book).

+0

Благодарим за отзыв. Я не знал этого удобного сайта. Мой график - это ссылка. http://console.neo4j.org/?id=e242cm Пользователь может купить книгу за один раз. Это означает, что заказ может содержать только одну книгу. – Michael

+0

Благодарим вас за технику. У меня есть ожидаемый результат правильно, и я понимаю, почему мой первый запрос вернул ожидаемое что-то еще. Сложно представить себе поведение cypher в этом случае для меня, поэтому мне нужно больше наклонять cypher. спасибо – Michael

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