我正在开发一个网站并实现搜索过滤功能。我从neo4j的数据库中获取搜索结果。我正面临着应用过滤器的问题。问题是当添加搜索时说班加罗尔我得到10个结果然后我添加另一个关键字让开发人员我从整个数据库得到结果但我想要它应该只来自选定的结果或班加罗尔的关键字
我的查询是:
$data = array (
"query" => "MATCH (x :Job)-[r :POSTED_JOB]-(m) where ( x.city IN {data1} or x.categories or x.sectors IN {data4} or x.role IN {data5} or x.requirement IN {data6}
or x.title IN {data7} or x.description IN {data8})
RETURN m.companyName,x.city",
"params" => array(
"data1" => $city,
"data4" => $sector,
"data5" => $skills,
"data6" => $search,
"data7" => $search,
"data8" => $search
) );
如何编写此查询以优化结果。
答案 0 :(得分:1)
您的查询已满OR
s,这意味着Job
将匹配任何(该数组包含两个data5属性)。如果您想匹配所提供条件的所有,请将OR
换成AND
s。根据您提供的数据,您可能需要注意NULL值和空列表。
编辑 - 示例代码
这是您认为可能与您正在讨论的字段匹配的查询的一小部分。
WHERE x.city IN {data1} OR x.role IN {data5}
它说匹配我任何Node(x)WHERE x在班加罗尔 OR WHERE x用于开发人员角色。如果您希望查询仅匹配班加罗尔和开发人员的记录,则该部分查询应为:
WHERE x.city IN {data1} AND x.role IN {data5}
x.categories似乎也有点搁浅(除了它的存在,你不会查询任何东西)。
编辑 - 发布聊天
要求是执行连续查询,其中每个查询充当先前结果的过滤器。所有字段都与每个呼叫重新匹配。要实现此目的,您需要有一个外部节点标识符,可用于链接查询,然后将标识符集传递给每个连续查询。 Cypher中的简化示例:
初步查询:
MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.title=~{searchString} OR j.description=~{searchString}
RETURN j.jobId, j.title, j.description, j.city, m.companyName
后续查询:
MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.jobId IN {collectionOfJobIds}
AND (j.title=~{searchString} OR j.description=~{searchString})
RETURN j.jobId, j.title, j.description, j.city, m.companyName
编辑 - 因为它困扰着我
您可能希望在每个查询中重新匹配数据,因此您可以使用过滤器:
MATCH (j:Job)<-[:POSTED_JOB]-(m)
WHERE j.title=~({searchStrings}[0]) OR j.description=~({searchStrings}[0])
WITH m, COLLECT(j) as jobs
WITH m, FILTER (j IN jobs WHERE j.title=~({searchStrings}[1]) OR j.description=~({searchStrings}[1]) as filteredJobs
RETURN m, jobs
这需要将searchStrings作为数组传递,并且可以添加任意数量的WITHs(只需记住增加数组索引)。重要的是要意识到,对于所有这些查询,如果您有很多作业,那么当您开始匹配系统中的所有作业时,它们会变慢。如果你可以对最初的比赛施加一些限制,你的生活会更好!
ASIDE:你的模型实际上不是一个图表,你可以将城市,区域,技能等建模为节点而不是属性。