如何使用 ArangoDB 列出具有最相似条目的用户
How can I list the users with the most similar entries with ArangoDB
我今天开始了新项目。我有用户 table、标签 table 和 user_tags 图表结果的边缘。
我在图表上给用户附加了一些标签。如何使用 ArangoDB 列出具有最相似条目的用户。
例如:
- 用户 ID:112 有 3 个标签(标签 ID:50、51、52、53)
- 用户id:113有5个标签(标签ids: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)
不常见的数据不应包含在结果中
用户编号:115
没有人知道arangodb的解决方案,有neo4j的解决方案我可以用neo4j
谢谢。
在密码中,这是查询:
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
干杯
在 ArangoDB 中,只要您创建一个以 users
和 tags
作为顶点集合,并以 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)
}
它可能可以进行大量优化,但像这样分解它更容易理解。
我今天开始了新项目。我有用户 table、标签 table 和 user_tags 图表结果的边缘。
我在图表上给用户附加了一些标签。如何使用 ArangoDB 列出具有最相似条目的用户。
例如:
- 用户 ID:112 有 3 个标签(标签 ID:50、51、52、53)
- 用户id:113有5个标签(标签ids: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)
不常见的数据不应包含在结果中 用户编号:115
没有人知道arangodb的解决方案,有neo4j的解决方案我可以用neo4j
谢谢。
在密码中,这是查询:
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
干杯
在 ArangoDB 中,只要您创建一个以 users
和 tags
作为顶点集合,并以 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)
}
它可能可以进行大量优化,但像这样分解它更容易理解。