Neo4j:基于节点属性之一有条件地创建关系

4

我需要在两个节点之间创建两种不同类型的关系。关系类型取决于节点的某个属性。

例如,

我有两个节点USER和EVENT。我需要在它们之间创建两个关系。 1. 邀请 2. 请求邀请

每个事件节点都有一个inviteOnly属性。

如果inviteOnly为true,则创建“邀请”关系。否则创建“请求邀请”关系。

这是我的尝试:

MATCH (u:User)
WHERE ID(u) = 13
WITH u
MATCH (e:Events)
WHERE ID(e) = 0
WITH u,e
CREATE (u)-[:inviteONLYTrue]->(e) WHERE e.inviteOnly = true
CREATE (u)-[:inviteONLYFALSE]->(e) WHERE e.inviteOnly = false
WITH u,e
RETURN u,e
2个回答

6

目前没有条件语句,但是您可以通过遍历零个或一个元素列表来绕过该问题,该列表是通过CASE语句创建的。

MATCH (u:User) WHERE ID(u) = 13
MATCH (e:Events) WHERE ID(e) = 0
FOREACH (_ in case e.inviteOnly when true then [1] else [] end |
  CREATE (u)-[:inviteONLYTrue]->(e) )
FOREACH (_ in case e.inviteOnly when false then [1] else [] end |
  CREATE (u)-[:inviteONLYFALSE]->(e) )
RETURN u,e

你让我的一天变得美好...谢谢。 - vishal patel
是的,挽救了这一天 :-D - Maikel Bollemeijer

2

APOC Procedures 最近更新,支持条件Cypher执行,但在这个特定的情况下,你只需要一种创建带有动态关系类型的关系的方法。APOC也有一个相应的过程。这是一个例子:

MATCH (u:User)
WHERE ID(u) = 13
WITH u
MATCH (e:Events)
WHERE ID(e) = 0
WITH u,e, CASE WHEN e.inviteOnly THEN 'inviteONLYTrue' ELSE 'inviteONLYFALSE' END as relType
CALL apoc.create.relationship(u, relType, {}, e) YIELD rel
RETURN u,e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接