Php 用cypher查询在neo4j数据库中搜索关键字

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

我正在开发一个网站,并实现搜索过滤器功能。我正在从数据库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
) );


如何编写此查询以优化结果。

您的查询充满了
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