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

Neo4j 如何使用ArangoDB列出条目最相似的用户,neo4j,graph-databases,arangodb,arangodb-php,Neo4j,Graph Databases,Arangodb,Arangodb Php,我今天开始了一个新项目。我有用户表,标签表和用户标签边缘的图形结果 我在图上给用户附加了一些标签。如何使用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用户时。结果应与此类似: 用户id:114(3个匹配项,51、52、5

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

我在图上给用户附加了一些标签。如何使用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用户时。结果应与此类似:

  • 用户id:114(3个匹配项,51、52、53)
  • 用户id:113(2个匹配项,52个,53个)
  • 非通用数据不应包含在结果中 用户id:115

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


    谢谢。

    在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
    

    Cheers

    在ArangoDB中,只要您创建一个图形,将
    用户
    标记
    作为顶点集合,并将
    用户_标记
    作为边集合,此查询就会起作用:

    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)
        }
    

    它可能会被大量优化,但像这样进行分解会更容易理解。

    这些密码结果包括当前用户。所以我添加了u.id user\u id