2016-06-28 2 views
2

나는 그래프 데이터베이스에서 작업 중이며 사이퍼 쿼리을 작성했습니다.Cypher 쿼리 (Neo4j)에서 Union 이후의 결과 결합

는 예컨대 쿼리는 특정 사용자의 모든 게시물 및 쿼리의 다른 부분에 각 사람의 좋아하는 총 전혀 계산을위한 아래의

첫 번째 제품은 또한 유사하다.

쿼리

match a=(p:FaceBookPost{auther_id:"1"})-[hv:HAVE_LIKE]-(l:FacebookLike) 
return COUNT(l.auther_id) as total, (l.auther_id) as authers order by total DESC 

UNION ALL 

match a=(p:FaceBookPost{auther_id:"1"})-[hv:HAVE_COMMENT]-(l:FacebookComment) 
return COUNT(l.auther_id) as total, (l.auther_id) as authers order by total DESC 

UNION ALL 

match a=(i:InstagramPost{person_id:"1"})-[il:INSTAGRAM_LIKE]-(l:InstagramLike) 
return COUNT(i.person_id) as total, (l.person_id) as authers order by total DESC 

UNION ALL 

match a=(i:InstagramPost{person_id:"1"})-[ic:INSTAGRAM_COMMENT]-(c:InstagramComment) 
return COUNT(c.person_id) as total, (c.person_id) as authers order by total DESC 

아웃 넣어 :

| total | authers 
---+-------+--------- 
1 |  4 | author 1 
2 |  3 | author 2 
3 |  1 | author 3 
4 |  2 | author 1 
5 |  1 | author 2 
6 |  1 | author 3 
. |  . | ........ 
. |  . | ........ 
. |  . | ........ 
이 이 을 넣어 필요

:

| total | authers 
---+-------+--------- 
1 |  6 | author 1 
2 |  4 | author 2 
3 |  2 | author 3 

내가 다른 시도 필요한 아웃 풋에 대한 방법 및 다른 쿼리. 하지만 해결책을 얻지 못했습니다.

사이퍼 (Cypher)에 필요한 출력 방법이 있습니까?

답변

3

현재로서는 UNION의 결과를 사후 처리 할 수있는 방법이 없습니다. 그러나 추가 할 계획이 있습니다 (https://github.com/neo4j/neo4j/issues/2725#issuecomment-227973992 참조).

그러나 예에서는 UNION의 필요성을 피할 수있는 방법을 모색 할 수 있습니다. 이것은 이해하기 쉽고 더 효율적입니다.

MATCH (:FaceBookPost{auther_id:"1"})-[:HAVE_LIKE|:HAVE_COMMENT]-(l) 
RETURN COUNT(*) as total, (l.auther_id) as authers order by total DESC 

UNION ALL 

MATCH (:InstagramPost{person_id:"1"})-[:INSTAGRAM_LIKE|:INSTAGRAM_COMMENT]-(l) 
RETURN COUNT(*) as total, (l.person_id) as authers order by total DESC 

이 더 나은이지만, 두 개의 서로 다른 시작점이 있기 때문에 여전히 UNION ALL 필요 - 하나의 표시 :FaceBookPost:InstagramPost가 :

첫째, 즉시 그 MATCH 조항의 일부를 결합 할 수 있습니다. 두 모델이 모두 추가 라벨을 공유하도록 모델을 업데이트 할 수 있다면 :Post이면 단일 쿼리로 줄일 수 있습니다.

MATCH (p:FaceBookPost) SET p:Post; 
MATCH (p:InstagramPost) SET p:Post; 

그런 다음 쿼리 :

모델을 업데이트

또한 함께 주석 유형을 대체, 관계 유형을 공유 예를 들어 단지 :LIKED (저두으로 :HAVE_LIKE:INSTAGRAM_LIKE을 대체 할 수 있습니다
MATCH (:Post{person_id:"1"})-[:HAVE_LIKE|:HAVE_COMMENT|:INSTAGRAM_LIKE|:INSTAGRAM_COMMENT]-(l) 
RETURN COUNT(*) as total, (l.person_id) as authers order by total DESC 

:COMMENTED).

+0

내 경우에는 말한대로 모델을 업데이트 할 수 없습니다. 또한 RDMS에서 Graph DB로 데이터를 마이그레이션 중입니다. –

+1

모든 쿼리를 단순화하므로 RDBMS에서 마이그레이션 한 후에 모델을 업데이트하는 방법을 찾을 수 있는지 확인하려고합니다. 그렇게 할 수 없다면, 결합 된 github 문제가 해결 될 때까지 union의 결과를 후 처리해야합니다. –

+0

답장을 보내 주셔서 감사합니다.하지만 제 경우에는 모델링이 불가능합니다. 트위터 데이터도 추가해야하기 때문입니다. 은 완전히 다른 모델입니다. –