似乎我无法添加关系,除非某些实体中已经存在一些遵循该关系的数据。它是否正确?我希望能够首先设置我的关系和标签,然后填充数据并让数据只使用这些关系。
我正在使用:
MATCH (from:this_label),(to:that_label)
WHERE from.id = to.uuid
CREATE (from)-[:hasARelationship]->(to);
基本上,我希望能够在某个标签的节点上定义一堆关系,即使这些节点类型尚不存在。然后,当这些节点的某些数据进入数据库时,它将自动连接关系。
答案 0 :(得分:1)
如果我理解正确,您希望使用MERGE
代替MATCH
。
MERGE (from:this_label) -[:hasARelationship]-> (to:that_label) WHERE from.id = to.uuid
如果您尝试创建没有节点的关系,我想在NEO4J中甚至不可能。事实上,在任何图表中都不可能实现。
答案 1 :(得分:1)
使用连接到虚拟节点的关系预填充数据库是没有意义的。其中有很多原因:
答案 2 :(得分:1)
区分强制执行约束和履行约束的责任可能会有所帮助。
Neo4j允许与标签相关的索引和约束。为标签创建的索引和约束用于索引和约束具有该标签的节点。从version 2.2.5开始,只有一种类型的约束:单个属性的唯一性约束。已经讨论过为属性组合和关系添加约束,但我不知道这些对话的状态。
Neo4j架构约束强制某些东西,但它们不会履行,从而改变您对数据库的操作以满足约束。如果存在约束强制执行标记为A
的节点,如果它与R
类型的关系具有标签B
的节点,则它们会阻止您的操作不满足约束,但他们不会满足你。
实现此目标的最佳方法是a)在客户端应用程序中满足此要求,或b)为Neo4j创建扩展。有关扩展示例,请考虑Stefan Armbruster的neo4j-uuid。它侦听事务(使用名为TransactionEventListener
的内容),并确保在数据库中创建的任何节点都具有UUID。此扩展通过相应的Neo4j架构约束满足只能强制执行(还有其他差异,例如,约束将限制在标签的范围内)。 / p>
实现您的意图的方法可以是创建一个扩展,它可以监听您写入数据库的内容并满足您的约束,在必要时更改您的操作;或者,在服务器(RESTful端点)中提供调用目标的那个,只要您想要创建具有特定标签的节点,就可以调用该目标。然后,扩展将创建实现模式所需的节点和其他元素。前者的缺点可能是听取所有操作的开销,后者的缺点可能是它破坏了与数据库的交互流以引入单独类型的调用(例如,如果您通常执行cypher语句和必须暂停发出单独的POST
请求并在继续之前解释响应。