【问题标题】:Search keywords in neo4j database by cypher query通过 cypher 查询在 neo4j 数据库中搜索关键字
【发布时间】:2014-11-27 05:07:23
【问题描述】:

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

) );

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

【问题讨论】:

    标签: php database neo4j filtering cypher


    【解决方案1】:

    您的查询充满了ORs,这意味着Job 将匹配任何一个(该数组包含两个data5 属性)。如果您想匹配所有提供的条件,请将ORs 替换为ANDs。根据您提供的数据,您可能需要注意 NULL 值和空列表。

    编辑 - 示例代码

    这是您查询的一小部分,我认为可能与您正在谈论的字段匹配。

    WHERE x.city IN {data1} OR x.role IN {data5}
    

    它说匹配我任何节点 (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 作为数组传入,并且您可以添加任意数量的 WITH(只要记住增加数组索引)。重要的是要意识到,对于所有这些查询,如果您有很多作业,它们会很慢,因为您首先要匹配系统中的所有作业。如果您可以对初始匹配设置一些限制,您的生活会更好!

    旁白:尽管您可能会将城市、部门、技能等建模为节点而不是属性,但您的模型并不是真正的图表。

    【讨论】:

    • 谢谢@JohnMark13 我没听懂你想说的。你能用例子详细解释一下吗?
    • @Stefan Armbruster 请帮帮我
    • 你能解释一下你不明白的地方吗?
    • 谢谢@JohnMark13 但问题是在这种情况下,如果角色不匹配,那么整个查询将导致 null。因为输入来自用户,所以他可以输入任何内容。
    • 我和你分享了截图。请检查一次,然后您就可以理解我要做什么了。
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2014-05-24
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多