我想使用cypher在数组中的项和另一个节点之间创建关系。
此查询的结果是彼此连接的空节点列表。
MATCH (person:person),(preference:preference)
UNWIND person.preferences AS p
WITH p
WHERE NOT (person)-[:likes]->(preference) AND
p = preference.name CREATE (person)-[r:likes]->(preference)
其中person.preferences包含一系列首选项名称。
显然我做错了什么。我是neo4j的新手,非常感谢上面的任何帮助。
答案 0 :(得分:1)
属性是节点的属性,而关系涉及一个或两个节点。因此,无法在两个节点的属性之间创建关系。您需要将属性拆分为自己的节点集合,然后在各个节点之间创建关系。
你可以在一个陈述中完成所有这些 - 就像这样:
create (:Person {name: "John"})-[:LIKES]->(:Preference {food: "ice cream"})
对于其他人,您不希望创建重复的首选项,因此您需要查找首选项,创建:Person节点,然后创建关系,如下所示:
match (preference:Preference {food: "ice cream"})
create (person:Person {name: "Jane"})
create (person)-[:LIKES]->(preference)
您的用例的底线是您需要将首选项数组拆分为一组节点,然后在人员节点和新的首选项节点之间创建关系。
答案 1 :(得分:0)
有一件事......
匹配(人:人),(偏好:偏好)试试这个......
// Get all persons
MATCH (person:person)
// unwind preference list, (table is now person | preference0, person | preference1)
UNWIND person.preferences AS p
// For each row, Match on prefrence
MATCH (preference:preference)
// Filter on preference column
WHERE preference.name=p
// MERGE instead of CREATE to "create if doesn't exist"
MERGE (person)-[:likes]->(preference)
RETURN person,preference
如果这不起作用,您能提供样本数据和noe4j版本吗? (据我所知,你的查询应该在技术上有效)