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)
我使用以下命令在 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)