Neo4j IN子句不区分大小写

时间:2016-06-02 06:46:29

标签: neo4j neo4jclient

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

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

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

我有这个清单:['a','c'] - >它将返回第一人

我知道我必须在这个查询中使用IN子句,但我不知道如何实现它。

我想在Neo4j数据库浏览器和Neo4j客户端.Net中编写命令。

有人可以帮我吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

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"是改变模型。如果我们假设名称可以与不同的人重复,那么对于每个名称,都需要添加一个节点,并添加与该人的关系:

enter image description here

创建查询:

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)