首页 > 解决方案 > 如何根据大量名称在 neo4j 数据库中查找节点

问题描述

所以我使用 neo4j 数据库,我想在这个数据库中找到某些人。人们被存储为节点,并且与其他节点具有某些属性和关系。现在我有一个我想找到的人的列表(xlsm/csv 文件)。此列表包含大约 8000 个名称以及我可以用于查询的其他属性。

我设法通过使用列表中的各个名称来搜索节点,例如:

MATCH (n)

WHERE n.name = 'Peter'

RETURN n.name, n.age

我也知道我可以查看某个属性是否出现在字符串列表中:

MATCH (a)

WHERE a.name IN ['Peter', 'Timothy']

RETURN a.name, a.age

但是,我无法通过手动输入列表中的数千个名称来创建查询。那么按我想找到的人过滤的最有效方法是什么?

标签: databaseneo4jcyphergraph-theorycypher-3.1

解决方案


一种方法是使用LOAD CSV- 通常您会使用它将数据加载到图表中,但您不必这样。给定一个图表:

MERGE (:Person { name: 'Geoff' })
MERGE (:Person { name: 'Timothy' })
MERGE (:Person { name: 'Peter' })

一个 CSV 文件被放入数据库的导入目录中:

Name,Phone
Timothy,07700900100
Peter,07700900101

您可以将所有有兴趣搜索的名称加载到列表中,然后使用标准IN子句查找它们:

LOAD CSV WITH HEADERS FROM 'file:///names.csv' AS line
WITH collect(line.Name) AS names
MATCH (p: Person) WHERE p.name IN names
RETURN p

在此处输入图像描述

请注意,我们已将 Geoff 排除在外,因为他不在 CSV 中。

另一种方法是尝试一次匹配传入 CSV 的每一行,这样可以更轻松地过滤多个属性:

LOAD CSV WITH HEADERS FROM 'file:///names.csv' AS line
MATCH (p: Person) WHERE p.name = line.Name AND p.phone = line.Phone
RETURN p

推荐阅读