注
我让这个问题变成了几个问题而不是我提出的简单问题,所以我将后续内容分解为他们自己的问题here。
原始问题
我正在接收一份ID列表,我首先会测试它们是否在我的图表中,以及它们是否/我正在进一步处理这些节点。
所以,例如......
fids = get_fids(record) # [100001, 100002, 100003, ... etc]
ids_in_my_graph = filter(id_is_in_graph, fids) # [100002]
def id_is_in_graph(id):
val = False
query = """MATCH (user:User {{id_str:"{}"}})
RETURN user
""".format(id)
n=neo4j.CypherQuery(graph_db,query).execute_one()
if n:
val = True
return(val)
可以想象,使用过滤器执行此操作,顺序测试每个ID是否在我的图表中确实非常非常慢,并且显然没有正确使用neo4j。
我如何重新设置查询,以便创建像(User{id_str: [mylist]})
这样的列表来查询并仅返回图表中的ID?
答案 0 :(得分:2)
您可能希望通过利用cypher的集合功能来使用WHERE ... IN。 Here's the relevant reference
所以你的查询可能如下所示:
MATCH (user:User)
WHERE user.id_str IN ["100001", "100002", "100003"]
return user;
现在,我不知道一个集合有多大。我怀疑如果你的收藏中有1000件物品,这会有用。但至少这是一种将它们分成块的方式。这应该可以提高性能。
的“收藏”部分答案 1 :(得分:1)
您应该使用带有参数的密码,例如{id},然后将"id"-> record.id
传递给执行
MATCH (user:User {id_str:{user_id}}),(friend:User {id_str:{friend_id}})
CREATE UNIQUE (user)-[:FRIENDS]->(friend)
{ "user_id" : record.id, "friend_id" : i}
确保添加
create unique constraint on (u:User) assert u.id is unique;
您可以一次将多个语句发送到cypher的事务性http端点:
http://docs.neo4j.org/chunked/milestone/rest-api-transactional.html
您的驱动程序可能已经支持。