我使用以下命令在neo4j db中创建了一个节点:
CREATE (n:Person {Names: 'A', 'B', 'C'}) RETURN n;
CREATE (n:Person {Names: 'D'}) RETURN n;
现在,我想进行查询以检索具有特定列表中某个名称的人。
我有这个清单:['a','c'] - >它将返回第一人
我知道我必须在这个查询中使用IN子句,但我不知道如何实现它。
我想在Neo4j数据库浏览器和Neo4j客户端.Net中编写命令。
有人可以帮我吗?
谢谢。
答案 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"是改变模型。如果我们假设名称可以与不同的人重复,那么对于每个名称,都需要添加一个节点,并添加与该人的关系:
创建查询:
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)