2016-09-21 2 views
2

내가 이상한 문제에 직면 한 빈 전체 결과를 만들어, 내가 built.Here이있는 neo4j 그래프에서 데이터를 얻기 위해 시도하는 것은Neo4j 사이퍼 쿼리

MATCH (u1:User {user_id: 4})-[:FOLLOWS]->(u2:User)-[]->(r1:Rest{city_id: 1}) 
WITH COLLECT ({ REST: r1.res_id}) as rows 
MATCH (u1:User {user_id: 4})-[rel]->(r2:Rest{city_id: 1}) 
WHERE NOT (u1:User {user_id: 4})-[rel : BEEN_THERE | ADD_REVIEW]->(r2:Rest{city_id: 1}) 
WITH rows + COLLECT ({ REST: r2.res_id}) AS allrows 
UNWIND allrows as row 
RETURN row.REST as RESTAURANT_ID, count(row.REST) as COUNT 
ORDER BY COUNT desc 
LIMIT 15; 

그러나 때 결과 내 쿼리입니다 COLLECT ({REST : r2.res_id})가 비어 있으면 전체 결과가 비게됩니다. 또한 첫 번째 일치에서 행을 식별 할 수없는 쿼리는 정의되지 않은 rows을 반환합니다. 저에게 알려주세요. 감사!

답변

2

패턴이 경로와 일치하지 않으면 실제로 결과가 비어있게됩니다.

당신은 2의 MATCH을 분할하고 두 번째 OPTIONAL을해야, 실제 경우 나, 또 다시 같은 u1 노드를 일치 중지 :

MATCH (u1:User {user_id: 4}) 
OPTIONAL MATCH (u1)-[:FOLLOWS]->(:User)-->(r1:Rest {city_id: 1}) 
WITH u1, collect({ REST: r1.res_id }) AS rows 
OPTIONAL MATCH (u1)-->(r2:Rest {city_id: 1}) 
WHERE NOT (u1)-[:BEEN_THERE | ADD_REVIEW]->(r2) 
WITH rows + collect({ REST: r2.res_id }) AS allrows 
UNWIND allrows as row 
RETURN row.REST AS RESTAURANT_ID, count(row.REST) AS COUNT 
ORDER BY COUNT desc 
LIMIT 15 

나는 확실하지 않다 귀하의 경우에는 처음으로 OPTIONAL MATCH (두 번째는 collect을 차단제로 언급 함), 두 패턴 모두를 비울 수있는 두 패턴의 집계를 원한다면 여기를 클릭하십시오.

+0

답장을 보내 주셔서 감사합니다. 제대로 작동하고 있습니다. –

+0

@AditKaushal 답변을 주저하지 말고 (https://stackoverflow.com/help/someone-answers). –