我使用NEO4j进行了一个没有过滤器(包含+ OR/AND条件)的查询,但是当我添加过滤器时,查询被卡住了,没有响应。如果没有过滤器,下面有+- 70,000个结果查询示例:
MATCH (movie: movie) WHERE (movie.movie="xxx_xxxx" )
with movie
MATCH (movie)-[found:found]->(n:firstName)
with n, movie
MATCH (n)-[:cinema|secondName*0..1]->(g)-[p:cinema]->(cinema:cinema)<-[found:found]-(movie)
with n,g,cinema,movie
OPTIONAL MATCH (cinema)-[as:ID]->(id:ID)<-[found:found]-(movie)
with n,g,cinema,id,movie
OPTIONAL MATCH (id:ID)-[p2:cinema]->(cinema2:cinema)<-[found:found]-(movie)
with n,g,cinema,id,cinema2
OPTIONAL MATCH path2 = ((cinema:cinema)-[as:ID]->(id:ID)-[p2:cinema]->(cinema2:cinema))
with path2,n,g,id,cinema,cinema2
MATCH path = (n)-[:cinema|secondName*0..1]->(g)-[p:cinema]->(cinema:cinema)
with n,cinema,path,path2
WHERE
( ( toLower(n.nickname) CONTAINS toLower("jhon") OR
toLower(g.nickname) CONTAINS toLower("jhon") OR
toLower(cinema.address) CONTAINS toLower("jhon")
) )
return DISTINCT NODES(path)+COALESCE (NODES(path2),[]), RELATIONSHIPS(path)+COALESCE (RELATIONSHIPS(path2),[])
SKIP 0 LIMIT 5您知道为什么筛选器会阻塞查询吗?
发布于 2020-07-30 19:46:53
您的WHERE子句需要g,但前面的WITH子句没有传递它。Cypher计划器似乎没有将其标记为错误(至少在4.1.0中是这样),但它可能会导致问题。因此,尝试将with n,cinema,path,path2更改为with n,cinema,path,path2,g。
顺便说一句,您的WHERE子句可以提高一些效率,因为当您只需要按原样使用"jhon“时,就不需要调用TOLOWER("jhon") (最多3次)。所以,你应该改变这一点:
WHERE
( ( toLower(n.nickname) CONTAINS toLower("jhon") OR
toLower(g.nickname) CONTAINS toLower("jhon") OR
toLower(cinema.address) CONTAINS toLower("jhon")
) )对此:
WHERE
toLower(n.nickname) CONTAINS "jhon" OR
toLower(g.nickname) CONTAINS "jhon" OR
toLower(cinema.address) CONTAINS "jhon"https://stackoverflow.com/questions/63175424
复制相似问题