如何在Cypher查询中基于已有MATCH结果应用全文索引搜索
问题背景
我现在有一段Cypher查询:
MATCH (p:Person { id: $p_id })-[k1:`KNOWS`]->(person:Person) WHERE (// 某些条件) MATCH (person)-[work:`WORKED_AT`]->(company:Company) WHERE (work.title contains "Product Manager" and work.start_date is not null) WITH person, work RETURN DISTINCT person.full_name, work.title
这段查询存在大小写敏感问题,如果数据库里的职位是product manager这类小写形式,查询就会返回空结果。
我已经在:WORKED_AT关系上创建了全文索引,且验证过索引可用——执行下面的查询:
call db.index.fulltext.queryRelationships("<indexName>", "CEO") yield relationship return relationship.title limit 10
能返回各种大小写形式的结果,比如:
CEO Ceo ..etc
我的疑问
怎么把这个全文索引搜索整合到原来的节点查询里?比如像下面这样,在WHERE子句里对work关系应用全文索引查询:
MATCH (p:Person { id: $p_id })-[k1:`KNOWS`]->(person:Person) WHERE (// 某些条件) MATCH (person)-[work:`WORKED_AT`]->(company:Company) WHERE // 在此处对work应用db.index.fulltext.queryRelationships WITH person, work RETURN DISTINCT person.full_name, work.title
解决方案
你可以通过两种方式将全文索引整合到现有查询中:
方式1:通过子查询关联索引结果
把全文索引调用作为子查询,通过person节点关联对应的任职关系,同时保留start_date非空的过滤条件:
MATCH (p:Person { id: $p_id })-[k1:`KNOWS`]->(person:Person) WHERE (// 某些条件) CALL db.index.fulltext.queryRelationships("<indexName>", "Product Manager") YIELD relationship AS work WHERE work.start_date IS NOT NULL AND startNode(work) = person WITH DISTINCT person, work RETURN person.full_name, work.title
这里startNode(work) = person是为了确保找到的关系属于当前匹配到的person节点,避免关联到无关的任职记录。
方式2:直接在WHERE子句中匹配索引结果
先匹配到目标person节点,再通过索引筛选对应的WORKED_AT关系:
MATCH (p:Person { id: $p_id })-[k1:`KNOWS`]->(person:Person) WHERE (// 某些条件) MATCH (person)-[work:`WORKED_AT`]->(company:Company) WHERE work IN [ (rel) IN db.index.fulltext.queryRelationships("<indexName>", "Product Manager") | rel ] AND work.start_date IS NOT NULL WITH DISTINCT person, work RETURN person.full_name, work.title
注意将代码中的<indexName>替换成你实际创建的全文索引名称。
如果需要精准匹配完整短语(避免拆分匹配),可以把查询词用双引号包裹,比如"Product Manager"。
内容的提问来源于stack exchange,提问作者abbood
相关产品推荐
相关产品推荐

