Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j-什么';这是基于一组ID检查数据库中是否有多个项的最佳方法_Neo4j_Cypher - Fatal编程技术网

Neo4j-什么';这是基于一组ID检查数据库中是否有多个项的最佳方法

Neo4j-什么';这是基于一组ID检查数据库中是否有多个项的最佳方法,neo4j,cypher,Neo4j,Cypher,我有一堆1000个ID(比如:“id1”、“id2”、“id3”…“id100”)的“项目”,我从第三方服务器获得。我有一个拥有10-50个“项目”的用户,如下所示: (user)-[:owns]->(:ITEM{id: "id1"}) 来自第三方服务器的100个项目ID是随机的。我需要编写一个密码查询,告诉给定用户已经拥有多少第三方项目 目前我正在做: MATCH (user{id:userId}-[:OWNS]->(i:ITEM) WHERE i.id = "id1" ||

我有一堆1000个ID(比如:“id1”、“id2”、“id3”…“id100”)的“项目”,我从第三方服务器获得。我有一个拥有10-50个“项目”的用户,如下所示:

(user)-[:owns]->(:ITEM{id: "id1"}) 
来自第三方服务器的100个项目ID是随机的。我需要编写一个密码查询,告诉给定用户已经拥有多少第三方项目

目前我正在做:

MATCH (user{id:userId}-[:OWNS]->(i:ITEM) 
WHERE i.id = "id1" || i.id = "id2" || i.id = "id3" ..... || i.id = i"d100"
RETURN i
有更好的方法吗


请注意:用户拥有的项目数量可能在1000个,其中来自第三方的项目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的项目,它将返回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

非常简单的问题,谢谢。不过,我会分割用户匹配和(用户)-[:拥有]->(项目)物联网,以避免遍历匹配器操作和用户/id索引的好处。谢谢Nicole。第二个版本对我来说更简单。不知道如何处理node.js中的w/1st版本(即将ID作为{IDs}的“参数”传递),谢谢!我不知道我们可以用“With”作为cypher的起始词。