建模Neo4j中的关系条件

时间:2016-09-26 18:00:08

标签: graph neo4j

我正在探索Neo4j,并希望实现以下效果:

(n1)-[r:next if n1.value > 2]->(n2)
(n1)-[r:next if n1.value <= 2]->(n3)

如果我查询(q) - [r] - &gt;(t)我这样做:

match (n:n1) set n.value=1
match (q)-[r]->[t] return q,r,t

我明白了:

(n1)-[next]->(n3)

如果我这样做

match (n:n1) set n.value=3
match (q)-[r]->[t] return q,r,t

我明白了:

(n1)-[next]->(n2)

我在这里看到过这样的效果: Modeling conditional relationships in neo4j v.2 (cypher)和此处:neo4j conditional relationship

然而,由于两个原因,这并不符合我的需要:

  1. 无法自动解决。例如,我假设我可以使用match (n1)-[r]->(n3) where n1.value = r.value进行查询。我还没有尝试过。
  2. 使用数值/范围。根据上面的示例,我希望能够将其用于范围。
  3. 或者,我可能完全错过了一些东西......

1 个答案:

答案 0 :(得分:0)

如果我理解正确(你的问题中有一些错误),这可能适合你:

MATCH (n1 {id:123}), (n2 {id: 234}), (n3 {id: 345})
WITH n1, n2,
  CASE WHEN n1.value > 2 THEN {a:[1]} WHEN n1.value <= 2 THEN {b:[1]} END AS todo
FOREACH(x IN todo.a | CREATE (n1)-[:NEXT]->(n2))
FOREACH(y IN todo.b | CREATE (n1)-[:NEXT]->(n3));

MATCH子句找到3个节点。

WITH子句恰好创建以下之一:

    如果todo.a ,则
  • n.value > 2集合 如果todo.b
  • ,则
  • n.value <= 2集合
  • a NULL todo

如果存在todo.atodo.b,则FOREACH子句中的一个(且仅一个)将创建适当的关系。