2017-02-20 9 views
0

오늘 새 프로젝트를 시작했습니다. 나는 사용자 테이블, 태그 테이블 및 그래프 결과에 대한 user_tags 에지 있습니다.ArangoDB와 가장 유사한 항목을 가진 사용자를 나열하는 방법

그래프에 태그를 사용자에게 연결했습니다. ArangoDB를 사용하여 가장 유사한 항목을 가진 사용자를 어떻게 나열 할 수 있습니까? 예를 들어

:

  • 사용자 ID : 112 (3 개) 태그 (태그 ID가 50, 51, 52, 53)이
  • 사용자 ID : 113 5 개 태그 (태그 ID를 갖는 52, 53, 54, 55, 56)
  • 사용자 ID : 51, 52, 53, 54)
  • 사용자 ID : 48, 49)
: 115 2 개 태그 (태그 ID를 갖는 114 4 개 태그 (태그 ID를 가지고

사용자 ID 112 사용자를 검색했을 때. 그 결과,이 유사해야

  1. 사용자 ID : 114 (3 개 매치, 51, 52, 53)
  2. 사용자 ID : 113 (2 개 매치, 52, 53)

비 - 공통 데이터가 결과에 포함되어서는 안됩니다. 사용자 ID : 115

아무도 알란도 솔루션을 모른다면 neo4j를 사용하는 솔루션이 있으면 neo4j를 사용할 수 있습니다.

감사합니다.

ArangoDB에서

답변

0

이 쿼리입니다 귀하의 가장자리 컬렉션 :

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

아마도 크게 최적화 할 수 있지만 이렇게 쉽게 분리 할 수 ​​있습니다. 이해하다.

+0

이러한 사이퍼 결과에는 현재 사용자가 포함됩니다. 그래서 나는 당신의 예제에 u.id <> user_id <- 114를 추가했다. 감사! – fourfourtwo

0

는,이 쿼리가 너무 오래 당신이 정점 컬렉션으로 userstags와 그래프를 만들 때, 작동

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 

환호하고 user_tags 등 : 사이퍼에서