如何用cypher实现分面搜索?
How to implement faceted search with cypher?
我的域模型有一个有点多面的搜索任务。
我有一个由两部分组成的图表:
(:TAG)
的层次结构树,父标签与其子标签之间存在 -[:IS_A]->
关系。请注意,树的每个分支都有不同的深度级别。
每个 (:TAG)
节点都有唯一的 "name"
(字符串)属性
- 单个
(:IMG)
节点,具有独特的 "name"
(字符串)和 "href"
(字符串)属性。
- 每个
(:IMG)
都连接到至少一个 (:TAG)
关系 (:TAG)-[:DESCRIBES]->(:IMG)
,但可能有 (:TAG)
个节点不连接任何 (:IMG)
个节点。
我需要能够说出任意数量的标签“名称”并响应所有相交的图像节点,但具有以下逻辑:
如果每两个 (:TAG)
节点都有相似的父 (:TAG)
节点,那么我需要响应连接到它们两个的图像,
否则(如果它们有不同的父 (:TAG)
节点),所以我只需要响应同时连接到它们的图像。
--
我已经知道的:
- 如果我想获取仅与相交标签(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
- 如果我想获取连接到每个标签(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)
我的域模型有一个有点多面的搜索任务。
我有一个由两部分组成的图表:
(:TAG)
的层次结构树,父标签与其子标签之间存在-[:IS_A]->
关系。请注意,树的每个分支都有不同的深度级别。 每个(:TAG)
节点都有唯一的"name"
(字符串)属性- 单个
(:IMG)
节点,具有独特的"name"
(字符串)和"href"
(字符串)属性。 - 每个
(:IMG)
都连接到至少一个(:TAG)
关系(:TAG)-[:DESCRIBES]->(:IMG)
,但可能有(:TAG)
个节点不连接任何(:IMG)
个节点。
我需要能够说出任意数量的标签“名称”并响应所有相交的图像节点,但具有以下逻辑:
如果每两个 (:TAG)
节点都有相似的父 (:TAG)
节点,那么我需要响应连接到它们两个的图像,
否则(如果它们有不同的父 (:TAG)
节点),所以我只需要响应同时连接到它们的图像。
--
我已经知道的:
- 如果我想获取仅与相交标签(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
- 如果我想获取连接到每个标签(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)