看来,我不能添加一个关系,除非在一些实体中已经有一些数据遵守这种关系。这是正确的吗?我希望能够首先设置我的关系和标签,然后填充数据,让数据只使用这些关系。
我正在使用:
MATCH (from:this_label),(to:that_label)
WHERE from.id = to.uuid
CREATE (from)-[:hasARelationship]->(to);
基本上,我希望能够在某个标签的节点上定义一组关系,即使这些节点类型还不存在。然后,当这些节点的一些数据进入数据库时,它将自动连接这些关系。
发布于 2015-09-23 10:55:09
区分执行约束的责任和履行约束的责任可能会有所帮助。
Neo4j允许与标签关联的索引和约束。为标签创建的索引和约束用于索引和约束具有该标签的节点。在2.2.5版中,只有一种类型的约束:单个属性的唯一性约束。曾经有过关于为属性组合和关系添加约束的讨论,但我不知道这些对话的状态。
Neo4j模式约束强制执行某些东西,但它们不会满足于更改数据库上的操作以满足约束的意义。如果存在强制执行具有label A
的节点只能在其与带有label B
的节点具有R
类型关系的情况下创建的约束,则如果该节点不满足该约束,则它们将阻止您的操作,但它们不会满足您的要求。
实现这一目标的最佳方法是:( a)在客户端应用程序中满足这一需求;或( b)为Neo4j创建一个扩展。对于扩展示例,请考虑Stefan的新4j-uuid。它侦听事务(使用所谓的TransactionEventListener
),并确保在数据库中创建的任何节点都具有UUID。此扩展满足只能由相应的Neo4j模式约束强制执行的内容(还有其他不同之处,例如,约束将限制在标签的范围内)。
实现您的目的的一种方法可以是创建一个听您写入数据库的内容并满足您的约束的扩展,在必要时更改您的操作;或者在您想要创建具有特定标签的节点时,在服务器中提供一个调用目标(一个RESTful端点)。然后,扩展将创建完成模式所需的节点和其他元素。前者的缺点可能是侦听所有操作的开销,而后者的缺点可能是它中断了您与数据库的交互流程,以引入单独类型的调用(例如,如果您通常执行cypher语句,并且必须暂停发出单独的POST
请求并在继续之前解释响应)。
发布于 2015-09-23 09:01:26
如果我对您的理解是正确的,那么您希望使用MERGE
而不是MATCH
。
MERGE (from:this_label) -[:hasARelationship]-> (to:that_label) WHERE from.id = to.uuid
如果您试图在没有节点的情况下创建关系,我想这在NEO4J中甚至是不可能的。事实上,这在一般的图表中是不可能的。
发布于 2015-09-23 09:51:19
用连接到虚拟节点的关系预填充DB是没有意义的。其中许多原因是:
https://stackoverflow.com/questions/32745235
复制相似问题