2014-10-15 7 views
1

피자의 각 유형이 "피자"레이블이있는 노드로 표시되고 각 토핑이 "토핑"레이블이있는 노드 인 피자 메뉴가 있습니다. 페퍼로니가있는 모든 피자를 얻으려면 다음과 같은 쿼리 MATCH (p : Pizza) - [: HAS] -> (t : Topping {type : "pepperoni"}) return p를 작성하십시오.
좋아하는 피자를 지정할 수있는 사용자가 있다고 가정 해보십시오. MATCH (u : 사용자) - [: HAS_FAVORITE] -> (p : 피자).일부 기준과 일치하는 모든 노드와 관계가있는 Cypher 일치 노드

페퍼로니 피자를 좋아하는 사용자를 찾는 가장 좋은 방법은 무엇입니까?

미리 감사드립니다.

답변

1

이 페퍼로니 토핑과 모든 피자 (들)을 좋아하는 모든 고유 한 사용자를 찾는 방법입니다 : 이것은 페퍼로니 토핑 ​​ALL 피자 (들)을 좋아하는 모든 고유 한 사용자를 찾을 수있는 한 가지 방법은

MATCH (u:User)-[:HAS_FAVORITE]->(p:Pizza)-[:HAS]->(t:Topping {type : "pepperoni"}) 
RETURN DISTINCT u; 

입니다 :

MATCH (p:Pizza)-[:HAS]->(t:Topping { type : "pepperoni" }) 
WITH COLLECT(p) AS ps 
MATCH (u:User)-[:HAS_FAVORITE]->(q:Pizza) 
WITH u, COLLECT(q) AS qs, ps 
WHERE ALL (x IN ps WHERE x IN qs) 
RETURN u; 
+0

모든 즐겨 찾기를 검색, 수집 및 평가하므로 성능이 저하됩니다. 내가 좋아하는 페퍼 로니를 평가하는 솔루션을 게시했습니다. 인덱스는 초기 일치에 사용되고 관계 횡단은 즐겨 찾기를 찾는 데 사용됩니다. –

+0

네, 저의 접근 방식은 그것을 수행하는 한 가지 방법이었으며 근본적으로 무차별적인 접근이었습니다. 보다 효과적인 접근 방식을 찾은 것을 기쁘게 생각합니다. 나는 대답을 보낸 후 나중에 나에게 일어난 일과 아주 흡사합니다. – cybersam

+0

그건 그렇고, 그게 당신에게 가장 적합한 경우 당신 자신의 대답을 수락하실 수 있습니다. – cybersam

2

다음 방법은 페퍼로니가있는 사용자의 즐겨 찾기 개수와 페퍼로니가있는 모든 피자 개수를 비교합니다. 페퍼로니가있는 사용자 즐겨 찾기 만 수집하기 위해 색인 및 관계 탐색을 사용하여 일치하므로 잘 수행됩니다. cybersam이 올린 답변은 모든 즐겨 찾기를 전체 스캔해야하기 때문에 느립니다.

관련 문제