我将我在其他地方提出的问题分解为第二部分。
对于具有已知在图中的 id_str 的给定节点,我有一个新的 id_str 列表,它可能在图中也可能不在图中。如果他们/是/在图表中,我想与他们建立独特的关系。(如果不是,我想忽略它们。)
我目前的方法很慢。我正在 Neo 之外执行循环部分,使用 py2neo 并使用非常慢的过滤器一次写入一个条目。
本来我用...
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)"
FOREACH 构造似乎不支持创建唯一,即使这个答案表明这已得到修复。
再一次,我不能使用11.2.2 中建议的语法,因为我不希望创建其他节点,只希望创建与现有节点的新关系。