如何用cypher实现分面搜索?

How to implement faceted search with cypher?

我的域模型有一个有点多面的搜索任务。

我有一个由两部分组成的图表:

  1. (:TAG) 的层次结构树,父标签与其子标签之间存在 -[:IS_A]-> 关系。请注意,树的每个分支都有不同的深度级别。 每个 (:TAG) 节点都有唯一的 "name" (字符串)属性
  2. 单个 (:IMG) 节点,具有独特的 "name"(字符串)和 "href"(字符串)属性。
  3. 每个 (:IMG) 都连接到至少一个 (:TAG) 关系 (:TAG)-[:DESCRIBES]->(:IMG),但可能有 (:TAG) 个节点不连接任何 (:IMG) 个节点。

我需要能够说出任意数量的标签“名称”并响应所有相交的图像节点,但具有以下逻辑: 如果每两个 (:TAG) 节点都有相似的父 (:TAG) 节点,那么我需要响应连接到它们两个的图像, 否则(如果它们有不同的父 (:TAG) 节点),所以我只需要响应同时连接到它们的图像。

--

我已经知道的:

  1. 如果我想获取仅与相交标签(tag1 或 tag2 或 tag3)相关的图像,那么我需要以下查询:
MATCH
(img:IMG)<-[*]-(:TAG {name:'Tag Name A'}),
(img:IMG)<-[*]-(:TAG {name:'Tag Name B'}),
(img:IMG)<-[*]-(:TAG {name:'Tag Name C'})
RETURN img
  1. 如果我想获取连接到每个标签(tag1 和 tag2 和 tag3)的图像,那么我需要以下查询:
MATCH (img:TEST_01_Img)
WHERE
(img)<-[*]-(:TAG {name:'Tag Name A'})
OR
(img)<-[*]-(:TAG {name:'Tag Name B'})
OR
(img)<-[*]-(:TAG {name:'Tag Name C'})
RETURN img

而且我认为必须以某种方式将这两种方法与 (if.​​..else) 逻辑相结合,如果图像具有相同标签的父级则合并结果,如果图像具有不同标签的父级则相交。

也许我需要使用 Conditional Cypher Execution,但我不知道如何使用,因为我对此很陌生。

非常感谢您的提前帮助!

是的,您可以将 match [pattern] 与 where [pattern] 结合使用。示例:

// Tagged A and B
MATCH (img)<-[*]-(:TAG {name:'Tag Name A'})
WHERE (img)<-[*]-(:TAG {name:'Tag Name B'})

// Tagged A but not B
MATCH (img)<-[*]-(:TAG {name:'Tag Name A'})
WHERE NOT (img)<-[*]-(:TAG {name:'Tag Name B'})

请参阅在何处使用模式 (https://neo4j.com/docs/cypher-manual/current/clauses/where/#query-where-patterns)