2

ノート

これは、私が尋ねた単純な質問ではなく、いくつかの質問になるので、フォローアップをここで独自の質問に分割します。

元の質問

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 のみを返すように、クエリをどのように言い換えればよいでしょうか?

4

2 に答える 2

1

{id} などのパラメーターを指定して cypher を使用"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 に答える