我有一堆1000个ID(例如:" id1"," id2"," id3" ..." id100" "项目"我从第三方服务器获得。我有一个用户拥有已拥有10-50" item"如下所示:
(user)-[:owns]->(:ITEM{id: "id1"})
来自第三方服务器的那100个项目ID是随机的。我需要编写一个cypher查询来告诉给定用户已经拥有多少第三方项目。
目前我在做:
MATCH (user{id:userId}-[:OWNS]->(i:ITEM)
WHERE i.id = "id1" || i.id = "id2" || i.id = "id3" ..... || i.id = i"d100"
RETURN i
有更好的方法吗?
请注意:用户拥有的项目数可能在1000s内,其中来自第三方的项目ID数量始终为常数(100)。对于给定用户,所有100个项目可能是匹配或0或1.
答案 0 :(得分:4)
理想情况下,您只需将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
答案 1 :(得分:2)
您可以对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的项目,则会返回3。