如何使用ArangoDB列出具有最相似条目的用户

时间:2017-02-20 16:32:50

标签: neo4j graph-databases arangodb arangodb-php

我今天开始了新项目。我有图表结果的用户表,标签表和user_tags边缘。

我在图表上附加了一些标签。如何使用ArangoDB列出具有最相似条目的用户。

例如:

  • 用户ID:112有3个标签(标签ID:50,51,52,53)
  • 用户ID:113有5个标签(标签ID:52,53,54,55,56)
  • 用户ID:114有4个标签(标签ID:51,52,53,54)
  • 用户ID:115有2个标签(标签ID:48,49)

当我搜索用户ID 112用户时。结果应与此类似:

  1. 用户ID:114(3场比赛,51,52,53)
  2. 用户ID:113(2场比赛,52,53)
  3. 非常见数据不应该在结果范围内 用户ID:115

    如果没有人知道arangodb解决方案,如果有neo4j解决方案,我可以使用neo4j。

    感谢。

2 个答案:

答案 0 :(得分:0)

在cypher中,这是查询:

MATCH (u1:User {id:114})-[:HAS_TAG]->(tag:Tag),
      (u:User)-[:HAS_TAG]->(tag:Tag)
WITH u, collect(id(tag)) AS tags
RETURN u, tags, size(tags) AS score
ORDER BY score DESC

干杯

答案 1 :(得分:0)

在ArangoDB中,只要您创建一个以userstags作为顶点集合,user_tags作为边集合的图表,此查询就可以运行:

LET active_user = FIRST(
    FOR u IN users
    FILTER u.id == @user_id
    RETURN u._id
)

LET active_tags = (
    FOR v IN 1..10 OUTBOUND active_user GRAPH 'user_tags_graph'
    RETURN (v.id)
)

FOR u IN users
FILTER u._id != active_user
    LET tags_in_use = FLATTEN(
        FOR v IN 1..10 OUTBOUND u._id GRAPH 'user_tags_graph'
        RETURN [v.id]
    )
    LET tag_matches = (
        RETURN LENGTH(INTERSECTION(active_tags, tags_in_use))
    )
    FILTER FIRST(tag_matches) > 0
    SORT tag_matches DESC
    RETURN {
        [u.id]: INTERSECTION(active_tags, tags_in_use)
    }

它可能会被大量优化,但是这样做会让它更容易理解。