1

別の場所で尋ねた質問を第 2 部に分割します。

グラフにあることがわかっている id_str を持つ特定のノードについて、グラフにある場合とない場合がある新しい id_str のリストがあります。それらがグラフにある場合は、それらに固有の関係を作成したいと思います。(そうでない場合は、無視したいと思います。)

私の現在の方法はかなり遅いです。私は py2neo を使用し、非常に遅いフィルターを使用して一度に 1 つずつエントリを書き込んで、Neo の外でループ部分を実行しています。

もともと使っていた...

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)

for i in ids_in_my_graph:
    """MATCH (user:User {{id_str:"{}"}}),(friend:User {{id_str:"{}"}})
       WHERE has(user.id_str) AND has(friend.id_str)
       CREATE UNIQUE (user)-[:FRIENDS]->(friend)""".format(record.id, i)

また、新しい /unique/ [:FRIENDS] 関係が必要ですが、有効な id_str を持つノードがまだ存在しない場合、新しいユーザーや新しい友達を作成したくありません。

したがって、コレクションで FOREACH を使用してこれを書き直そうとしています。実際の構文は次のようになると思います...

MATCH (user:User {id_str:"200001"}), (friends:User)
WHERE friends.id_str IN ["100001", "100002", "100003", "JUNK", "DOESNTMATCH", "IGNORED"]
FOREACH(friend in friends :
CREATE UNIQUE user -[:FRIENDS]-> friend)

しかし、私のエラーは

py2neo.neo4j.SyntaxException: Invalid input 'U': expected whitespace, comment, NodeLabel, MapLiteral, a parameter, a relationship pattern, '.', node labels, '[', "=~", IN, IS, '*', '/', '%', '^', '+', '-', '<', '>', "<=", ">=", '=', "<>", "!=", AND, XOR, OR or '|' (line 3, column 48)
"            FOREACH(friend in friends : CREATE UNIQUE user -[:FRIENDS]-> friend)"

この回答はこれが修正されたことを示唆していますが、Create Unique は FOREACH コンストラクトではサポートされていないようです。

ここでも、11.2.2 で提案されている構文は使用できません。これは、追加のノードを作成するのではなく、既存のノードとの新しい関係のみを作成する必要があるためです。

4

1 に答える 1