如何在Neo4j中跨多种节点类型匹配全文搜索结果
解决方案
你可以通过分步骤处理两种节点类型的匹配逻辑,避免变量冲突,同时用集合或条件判断来合并结果,以下是可行的单条查询方案:
方案一:使用条件判断合并结果
CALL db.index.fulltext.queryNodes("ftSearch", "jack ball") YIELD node, score OPTIONAL MATCH (node:Person)-[:HAS]-(personItem:Item) WITH node, personItem OPTIONAL MATCH ()-[:HAS]-(node:Item) WITH CASE WHEN node:Item THEN node ELSE personItem END AS item WHERE item IS NOT NULL RETURN DISTINCT item
逻辑说明:
- 通过全文索引获取匹配的节点
node - 针对
node是Person的情况,匹配其关联的Item并命名为personItem - 针对
node是Item的情况,直接保留该节点 - 用
CASE语句统一两种情况的结果为item,过滤空值后去重返回
方案二:使用集合收集后展开
CALL db.index.fulltext.queryNodes("ftSearch", "jack ball") YIELD node, score OPTIONAL MATCH (node:Person)-[:HAS]-(i:Item) WITH node, COLLECT(i) AS personItems OPTIONAL MATCH ()-[:HAS]-(node:Item) WITH personItems + CASE WHEN node:Item THEN [node] ELSE [] END AS allItems UNWIND allItems AS item RETURN DISTINCT item
逻辑说明:
- 先收集
Person节点关联的所有Item到集合personItems - 如果当前
node是Item类型,就将其作为单个元素的集合追加到personItems中 - 展开合并后的集合,去重后得到最终的
Item节点集合
这两个方案都不需要子查询,且解决了你之前遇到的变量覆盖问题,能准确返回你需要的两种Item节点。
内容的提问来源于stack exchange,提问作者Кирилл Саколин
相关产品推荐
相关产品推荐

