向数据库添加新节点,以及如何自动更新基于规则的链接

时间:2018-10-17 22:36:18

标签: neo4j hyperlink cypher

请原谅问题的简单性-我是新手!

我有几千个节点和几十个关系,但是该关系主要基于一系列规则和逻辑。

通过示例进行解释:如果我有定义为(c:CAT)和(d:DOG)的节点,并且每个节点都有一个称为size的属性,即c.size,d.size等,那么我可以很容易地根据以下规则运行一些Cypher脚本以建立节点之间的关系

MATCH (c:CAT), (d:DOG) WHERE c.size<d.size
CREATE (c:CAT)-[r:SMALLER_THAN]->(d:DOG)
RETURN c,d

这很棒,并且一切正常。假设我现在添加一个新的NODE

CREATE (c:CAT {type:"tiger", size:"4"})
RETURN c

这没有任何链接,但我希望应用相同的逻辑,即

CREATE (c:CAT)-[r:SMALLER_THAN]->(d:DOG)

  1. 删除所有链接并重新创建它们-将规则应用于整个系统
  2. 与“ MERGE”而不是“ CREATE”运行相同的Cypher命令,因此假定除非有必要,否则不会修改现有关系。
  3. 找到没有链接的节点,然后在它们上运行命令

我只想在添加新节点时更新链接,因为那时我知道新节点将没有链接。另外,如果我更改(:CAT)或(:DOG)的大小,则链接应自动更新。

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

如果仅对:CAT和:DOG节点执行此操作,则可以在创建节点的同时创建关系:

CREATE (c:CAT {type:"tiger", size:"4"})
MATCH (d:DOG)
WHERE c.size < d.size
CREATE (c)-[:SMALLER_THAN]->(d)

如果要在适用的地方创建相反的关系,则需要使用条件,或者使用FOREACH技巧:

CREATE (c:CAT {type:"tiger", size:"4"})
WITH c
MATCH (d:DOG)
WITH c, collect(d) as dogs
FOREACH (d in [d in dogs WHERE c.size < d.size] |
 CREATE (c)-[:SMALLER_THAN]->(d))
FOREACH (d in [d in dogs WHERE c.size > d.size] |
 CREATE (c)<-[:SMALLER_THAN]-(d))

或者您可以使用APOC条件。

关于更新节点的大小,您可能应该删除从该节点连接的所有:SMALLER_THAN关系,然后将不同的节点重新匹配到要连接的所有可能的节点并创建这些关系。