Neo4j IN 子句不区分大小写

Neo4j IN clause case-insensitive

我使用以下命令在 neo4j 数据库中创建了一个节点:

CREATE (n:Person {Names: 'A', 'B', 'C'}) RETURN n;
CREATE (n:Person {Names: 'D'}) RETURN n;

现在,我想进行查询以检索具有特定列表中某个姓名的人。

我有这个列表:['a','c'] -> 它会 return 第一个人

我知道我必须为此查询使用 IN 子句,但我不知道如何实现它。

我想在 Neo4j DB Browser 和 Neo4j Client .Net 中编写命令。

有人可以帮我吗?

谢谢。

1) 您的添加节点查询不正确。应该是这样的:

CREATE (n:Person {Names: ['A', 'B', 'C']}) RETURN n;
CREATE (n:Person {Names: ['D']}) RETURN n;

2) 要从列表中搜索至少一个值的出现,您可以使用谓词 ANY:

WITH ['a', 'D'] as Names
MATCH (P:Person)
WITH P, extract(name IN P.Names | LOWER(name)) as lowNames
  WHERE ANY(n IN Names WHERE LOWER(n) IN lowNames)
RETURN P

更新。不排除本着"graph"的精神更好的方法是改变模型。如果我们假设名字可以与不同的人重复,那么每个名字都需要添加一个节点,并添加与人的关系:

创建查询:

MERGE (P1:Person {id:'P1'}) 
MERGE (P2:Person {id:'P2'}) 
MERGE (P3:Person {id:'P3'}) 
MERGE (N1:Name {name:'A'}) 
MERGE (N2:Name {name:'B'}) 
MERGE (N3:Name {name:'C'}) 
MERGE (N4:Name {name:'D'}) 
MERGE (P1)-[:has_name]->(N1) 
MERGE (P1)-[:has_name]->(N2) 
MERGE (P1)-[:has_name]->(N3) 
MERGE (P2)-[:has_name]->(N4) 
MERGE (P3)-[:has_name]->(N1) 
MERGE (P1)-[:has_name]->(N4)`

以及搜索人员的查询:

// Find the desired names
WITH ['a', 'D'] as Names
WITH extract(name IN Names | LOWER(name)) as lowerNames
MATCH (N:Name) WHERE LOWER(N.name) IN lowerNames
// For each name, we find person
WITH N
  MATCH (P:Person)-[:has_name]->(N)
RETURN collect(distinct P)