0

我今天开始了新项目。我有用于图形结果的用户表、标签表和 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)

非常见数据不应包含在结果用户 ID 中:115

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

谢谢。

4

2 回答 2

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

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

于 2017-02-25T13:50:06.350 回答
0

在密码中,这是查询:

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

干杯

于 2017-02-20T18:14:13.050 回答