如何使用cypher在数组中的项和另一个节点之间创建关系

时间:2016-04-21 16:04:02

标签: neo4j cypher

我想使用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的新手,非常感谢上面的任何帮助。

2 个答案:

答案 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版本吗? (据我所知,你的查询应该在技术上有效)