Neo4j:匹配多个标签(2个或更多)

gau*_*roy 45 neo4j cypher

我想做一个搜索,我想开始遍历2个标签(OR条件).例如,我需要找出所有标记为"男性"或"女性"且其属性名称为"〜"的节点.AIL.".

jja*_*erg 48

你可以把它放在WHERE条款中:

MATCH n
WHERE n:Male OR n:Female
RETURN n
Run Code Online (Sandbox Code Playgroud)

编辑

正如@tbaum所指出的那样AllNodesScan.我在标签相当新的时候写了答案,并期望查询计划员最终用NodeByLabelScan每个标签实现它,就像单标签案例一样

MATCH n
WHERE n:Male
RETURN n
Run Code Online (Sandbox Code Playgroud)

我仍然认为这是查询的合理表达,并且期望查询规划器使用标签扫描来实现它是合理的,但是从Neo4j 2.2.3开始,查询仍然使用AllNodesScan标签过滤器实现.因此,这是一个更冗长的选择.由于标签析取符号表示集合并且此并集可以以不同方式表示,因此我们可以以查询计划程序实现的方式表达它而不扫描所有节点,而是以NodeByLabelScan每个标签开始.

MATCH (n:Male)
WHERE n.name =~ '.ail.'
RETURN n
UNION MATCH (n:Female)
WHERE n.name =~ '.ail.'
RETURN n
Run Code Online (Sandbox Code Playgroud)

这意味着为每个标签表达一次查询并使用显式加入它们UNION.这不是不合理的,至少对于较少数量的标签而言,但我不清楚为什么查询规划器不能从更简单的查询推断出相同的实现,所以我在这里打开了一个github问题.

  • 有没有更短的方法来做到这一点?例如,对于关系,您可以指定`(n) - [:rel1 | rel2] - >(m)`where` | `表示`OR` (9认同)

小智 16

MATCH n WHERE n:Label1 OR n:Label2
Run Code Online (Sandbox Code Playgroud)

...将导致AllNodesScan这是一个坏主意!

也许更好的解决方案:

OPTIONAL MATCH (n1:Label1)
WITH collect(distinct n1) as c1

OPTIONAL MATCH (n2:Label2) 
WITH collect(distinct n2) + c1 as c2

OPTIONAL MATCH (n3:Label3) 
WITH collect(distinct n3) + c2 as c3

UNWIND c3 as nodes
RETURN count(nodes),labels(nodes) 
Run Code Online (Sandbox Code Playgroud)

  • 为什么每个步骤都需要“与众不同”? (2认同)

Mar*_*ing 8

在 Neo4j 3.4.7 中,NodeByLabelScan当您使用带有 2 个 OR'ed 标签过滤器的 WHERE 查询时,查询规划器会执行一个 UNION,然后执行一个 2秒的 DISTINCT 。尝试沙箱离岸解密数据库EXPLAIN MATCH (o) WHERE o:Officer OR o:Entity RETURN o收益这一规划:

Neo4j 查询规划


Og *_*uza 8

对于v3.5,我们可以这样做:

\n\n
MATCH (n) WHERE (n:User OR n:Admin) AND n.name CONTAINS "ail" RETURN n\n
Run Code Online (Sandbox Code Playgroud)\n\n

并得到:

\n\n
\xe2\x95\x92\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x95\n\xe2\x94\x82"n"               \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82{"name":"Abigail"}\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82{"name":"Bailee"} \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n


小智 7

现在(2023 年)有一种专门的方法可以匹配多个标签。

这仅适用于 Neo4j 5 及更高版本。

MATCH (n:Movie|Person) RETURN n.name AS name, n.title AS title
在此输入图像描述

根据此处找到的文档。

为了解决您的具体查询:
MATCH (n:User|Admin) WHERE n.name CONTAINS "ail" RETURN n


小智 6

如果要通过 OR 或 IN 条件的多个标签过滤节点,请使用以下代码:

MATCH (n)
WHERE labels(n) in [['Male'],['Female']]
AND n.name =~ '.ail.'
RETURN n
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用嵌套列表?为什么不只是“[‘男’,‘女’]`? (2认同)