2

笔记

我让这变成了几个问题,而不是我问的简单问题,所以我在这里将后续问题分解为他们自己的问题。

原始问题

我收到了一个 ID 列表,我首先测试它们中的任何一个是否在我的图表中,如果它们 /are/ 我正在进一步处理这些节点。

所以,例如...

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?

4

2 回答 2

2

您可能希望通过利用 cypher 的收集功能来使用 WHERE...IN。 这是相关的参考

因此,您的查询可能如下所示:

MATCH (user:User) 
WHERE user.id_str IN ["100001", "100002", "100003"]
return user;

现在,我不知道一个集合可以有多大。如果您的收藏中有 1,000 件物品,我怀疑这是否可行。但至少这是一种将它们分批成块的方法。这应该会提高性能。

还可以查看Cypher 2.0 refcard的 Collections 部分

于 2014-04-02T19:35:10.193 回答
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

您的驱动程序可能已经支持它。

于 2014-04-02T22:18:49.087 回答