Neo4j - 根据一组 id 检查数据库中是否有多个项目的最佳方法是什么

Neo4j - What's the best way to check if multiple items are in the DB based on a set of ids

我有一堆 "items" 的 1000 个 ID(例如:"id1"、"id2"、"id3" ... "id100")来自第三方服务器。我有一个拥有 10-50 "items" 的用户,如下所示:

(user)-[:owns]->(:ITEM{id: "id1"}) 

来自第 3 方服务器的那 100 个物品 ID 是随机的。我需要编写一个密码查询,告诉给定用户已经拥有多少第 3 方项目。

目前我在做:

MATCH (user{id:userId}-[:OWNS]->(i:ITEM) 
WHERE i.id = "id1" || i.id = "id2" || i.id = "id3" ..... || i.id = i"d100"
RETURN i

有没有更好的方法?

请注意:用户拥有的物品数量可能在 1000 多个,而来自第 3 方的物品 ID 数量始终为常量 (100)。对于给定用户,所有 100 个项目可能是匹配项或 0 项或 1 项。

您可以对 Cypher 中的路径使用 FILTER 函数:

WITH ["id1","id2","id3","id4"] as ids
MATCH (user:User {id: userId})
WITH  filter(x in ids WHERE (user)-[:OWNS]->(:Item {id: x}) ) as itemMatches
RETURN size(itemMatches)

在此示例中,如果用户拥有 ID 为 1、3 和 4 的项目,它将 return 你 3.

理想情况下,您只需将 ID 集合作为参数传入即可:

MATCH (user {id:userId})-[:OWNS]->(i:ITEM)
WHERE i.id IN {ids}
RETURN COUNT(i) AS items

但您也可以在查询中声明它:

MATCH (user {id:userId})-[:OWNS]->(i:ITEM)
WHERE i.id IN ['id1', 'id2', 'id3', ..., 'id100']
RETURN COUNT(i) AS items