如何在NEO4j中订购具有其他关系的节点

时间:2015-08-04 20:55:34

标签: neo4j

我有两个节点用户和资源。它们之间的关系是:

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

我希望获得用户拥有的资源,并且订购那些也是最喜欢的资源。简而言之,我希望将最喜欢的资源放在用户拥有的所有其他资源之上。我该怎么办?

2 个答案:

答案 0 :(得分:4)

您可以匹配这两种类型,然后按计数排序。因此,与资源具有HASFAVOURITE关系的用户在该资源上的计数为2,在与其仅具有HAS关系的资源上的计数为1。

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;

这取决于模型中的冗余。我假设为了让用户喜欢一个资源,他们也必须“拥有”它。

答案 1 :(得分: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

如果用户有两次资源,则会返回两次,但由于有两个匹配的关系,它不会被视为收藏。用户根本没有匹配的收藏夹。