2015-08-04 2 views
1

У меня есть два узла пользователя и ресурсы. Отношения между ними являются:Как заказать узлы в NEO4j, которые также имеют другие отношения

User -> :HAS -> Resources 
User -> :favourite -> Resources 

Я хочу, чтобы получить ресурсы, которые имеют пользователя, а также порядка, что ресурсы, которые также являются любимым. Короче говоря, я хочу разместить любимые ресурсы поверх всех других ресурсов, которые есть у пользователя. Как мне это сделать?

+0

Вы хотите сказать, что для пользователя 'Peter' вы хотите перечислить все': RESOURCE', которые у него есть, и сверху вы хотите перечислить те, которые являются его ': FAVOURITE'? То есть вы хотите только вернуть ресурсы одного пользователя в порядке своей пользы, а не возвращать ресурсы одного пользователя в порядке интереса другого пользователя? – jjaderberg

+0

Я хочу получить все ресурсы, которые есть у peter. Но я хочу показать/получить ресурсы, которые являются фаворитами сверху. –

+0

До сих пор я понял, что мне нужно использовать порядок на всех ресурсах, которые я получил для пользователя. Но я застрял в том, как делать заказ, как есть отношения или нет? –

ответ

4

Вы можете совместить себя на обоих типах, а затем заказывать по счету. Таким образом, пользователи, у которых есть и HAS, и FAVOURITE отношения с ресурсом, будут иметь счет 2 на этом ресурсе и количество 1 на ресурсах, с которыми у них есть только связь HAS.

MATCH (user:User)-[rel:HAS|FAVOURITE]->(resource:Resource) 
WHERE user.name = "some user" 
WITH user, resource, COUNT(rel) AS rels 
ORDER BY rels DESC 
RETURN user.name, resource.name; 

Это зависит от избыточности в вашей модели. Я предполагаю, что для того, чтобы пользователь мог любить ресурс, они должны «иметь» это тоже.

0

Николь уже дал хороший ответ (+1), но если у вас есть случаи, когда

  • пользователь не имеет ресурса, но этот ресурс еще любимый
  • пользователь имеет ресурс в два раза, но это не любимая

вы можете справиться с этим также, если вы явно о соответствии на [:HAS] и рассчитывает на [:FAVOURITE]

MATCH (user:User { name:"Peter" })-[:HAS]->(resource) 
RETURN user.name, resource.name, LENGTH(user-[:FAVOURITE]->resource) AS favFactor 
ORDER BY favFactor DESC 

Если у пользователя есть ресурс дважды, он будет возвращен дважды, но он не будет считаться фаворитом из-за наличия двух согласованных отношений. Избранное, которое пользователь не имеет, не будет соответствовать вообще.

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