2016-09-21 90 views
2

我一直面临着奇怪的问题,我试图让从Neo4j的图形,我有built.Here数据是我的查询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})为空,整个结果变为空。此外,查询无法识别第一个匹配的行,并返回undefined 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)答案。 –