在数据库中添加没有数据的关系

时间:2015-09-23 16:54:13

标签: neo4j cypher

似乎我无法添加关系,除非某些实体中已经存在一些遵循该关系的数据。它是否正确?我希望能够首先设置我的关系和标签,然后填充数据并让数据只使用这些关系。

我正在使用:

MATCH (from:this_label),(to:that_label)
WHERE from.id = to.uuid
CREATE (from)-[:hasARelationship]->(to);

基本上,我希望能够在某个标签的节点上定义一堆关系,即使这些节点类型尚不存在。然后,当这些节点的某些数据进入数据库时​​,它将自动连接关系。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望使用MERGE代替MATCH

MERGE (from:this_label) -[:hasARelationship]-> (to:that_label) WHERE from.id = to.uuid

如果您尝试创建没有节点的关系,我想在NEO4J中甚至不可能。事实上,在任何图表中都不可能实现。

答案 1 :(得分:1)

使用连接到虚拟节点的关系预填充数据库是没有意义的。其中有很多原因:

  • 您将无法进行涉及此类关系的任何有意义的查询
  • 稍后尝试用实际数据填充虚拟节点可能是一项复杂的工作
  • 在需要时很容易创建关系。 neo4j是一个“无模式”的数据库(除非您定义唯一性约束,如@jjaderberg所述)。您可以随时创建将节点与任何标签(或无标签)连接的任何类型的关系。为了保持组织有序,您可以选择编写数据库客户端代码和Cypher查询以符合您自己的概念“模式”,但neo4j没有这样的要求。

答案 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请求并在继续之前解释响应。