检查neo4j图中是否存在节点

时间:2014-04-02 14:54:51

标签: neo4j cypher py2neo

我让这个问题变成了几个问题而不是我提出的简单问题,所以我将后续内容分解为他们自己的问题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?

2 个答案:

答案 0 :(得分:2)

您可能希望通过利用cypher的集合功能来使用WHERE ... IN。 Here's the relevant reference

所以你的查询可能如下所示:

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

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

另请参阅Cypher 2.0 refcard

的“收藏”部分

答案 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

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