我想做一个搜索,我想开始遍历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问题.
小智 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)
对于v3.5,我们可以这样做:
\n\nMATCH (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
小智 6
如果要通过 OR 或 IN 条件的多个标签过滤节点,请使用以下代码:
MATCH (n)
WHERE labels(n) in [['Male'],['Female']]
AND n.name =~ '.ail.'
RETURN n
Run Code Online (Sandbox Code Playgroud)