Php 用cypher查询在neo4j数据库中搜索关键字
我正在开发一个网站,并实现搜索过滤器功能。我正在从数据库neo4j获取搜索结果。我在应用过滤器时遇到了一个问题。问题是当添加搜索时,比如说班加罗尔,我得到了10个结果,然后我添加了另一个关键字,让开发者从整个数据库中得到结果,但我想要的是,它应该只来自以前选择的结果或是班加罗尔的关键字 我的问题是:Php 用cypher查询在neo4j数据库中搜索关键字,php,database,neo4j,filtering,cypher,Php,Database,Neo4j,Filtering,Cypher,我正在开发一个网站,并实现搜索过滤器功能。我正在从数据库neo4j获取搜索结果。我在应用过滤器时遇到了一个问题。问题是当添加搜索时,比如说班加罗尔,我得到了10个结果,然后我添加了另一个关键字,让开发者从整个数据库中得到结果,但我想要的是,它应该只来自以前选择的结果或是班加罗尔的关键字 我的问题是: $data = array ( "query" => "MATCH (x :Job)-[r :POSTED_JOB]-(m) where ( x.city
$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
)
);
如何编写此查询以优化结果。您的查询充满了
或s,这意味着作业
将在以下任何一个(该数组包含两个data5属性)匹配时匹配。如果要匹配所有提供的条件,请将或
s替换为和
s。根据您提供的数据,您可能需要注意空值和空列表
编辑-示例代码
这是您查询的一小部分,我认为它可能与您正在讨论的字段相匹配
WHERE x.city IN {data1} OR x.role IN {data5}
它表示匹配任何节点(x),其中x在班加罗尔或中,其中x代表开发人员角色。如果您希望查询只匹配班加罗尔和开发人员的记录,则查询的该部分应为:
WHERE x.city IN {data1} AND x.role IN {data5}
x、 类别似乎也有点搁浅(除了它的存在,你没有质疑任何东西)
编辑-聊天后发布
要求是执行连续查询,其中每个查询充当前一个结果的过滤器。所有字段都与每个调用重新匹配。要实现这一点,您需要有一个外部节点标识符,可以使用该标识符链接查询,然后将标识符集传递到每个后续查询中。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)谢谢@JohnMark13我不明白你想说什么。您能用例子详细解释一下吗。@Stefan Armbruster请帮我解释一下您不理解的内容吗?谢谢@JohnMark13,但问题是在这种情况下,如果角色不匹配,则整个查询结果将为空。因为输入来自用户,他可以输入任何东西。我和你们分享了截图。请检查一下,这样你就能明白我在做什么了。
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