从现有节点创建唯一节点';Neo4j的性质

从现有节点创建唯一节点';Neo4j的性质,neo4j,Neo4j,基本上,我与发送者和接收者有一组事务: Transaction 1 - Sender Joe - Receiver Bob Transaction 2 - Sender Bob - Receiver Sam Transaction 3 - Sender Bob - Receiver Nick 我的目标是获取每个唯一的发送者和接收者,并创建一个唯一的Person节点,该节点具有附加属性,如last\u online和email,最终,关系链(Person)->将->(事务)->发送到->(Per

基本上,我与发送者和接收者有一组事务:

Transaction 1 - Sender Joe - Receiver Bob
Transaction 2 - Sender Bob - Receiver Sam
Transaction 3 - Sender Bob - Receiver Nick
我的目标是获取每个唯一的发送者和接收者,并创建一个唯一的Person节点,该节点具有附加属性,如
last\u online
email
,最终,关系链
(Person)->将->(事务)->发送到->(Person)
。我已经定义了这些用户的一小部分,我想将未知用户和已知用户合并到同一个集合中

我尝试过使用
merge
create_unique
,最终为每个单人交易关系创建了重复节点,现在我明白了原因()。然而,我仍然不知道如何完成我想要完成的事情

编辑:以下是我正在运行的查询:

MATCH (t:Transaction) MERGE (p:Person{name:t.sender}) - [:sends] -> (t)
MATCH (t:Transaction) MERGE (t) - [:to] -> (p:Person{name:t.sender})

每个查询都会为每个
n
交易创建
n
钱包。

您必须仔细指定
合并使用的模式。如果
MERGE
在整个模式上找不到精确匹配,它将创建整个模式(甚至是已经存在的模式部分)

类似于以下的方法应该可以工作(假设
t
还包含一个事务
id
和额外的事务数据
foo
):


要加快处理速度,您应该首先查看
:Person(name)
:Transaction(id)

是否尝试了对发件人属性的唯一约束?@ShaikRizwana-yup。约束所做的只是阻止merge子句创建重复项(通过抛出错误),但除此之外,它实际上并没有创建唯一的节点并在查询中链接它们。问题是,由于合并函数的性质,它将每个新的“person where person.name=transaction.sender”视为一个唯一的节点,因此它尝试创建一个新节点(但由于约束而失败)。您能否与我们共享您的
合并
查询?我认为你犯了一个错误it@logisima已使用查询更新帖子。@Vises您是否尝试在匹配集和创建集上与合并?这也是避免重复和错误的方法。如果对名称应用了唯一约束,则不会对其应用重复的关系或节点。您还可以共享模式的UI或查询的显示吗?这是可行的,但我仍然有点困惑它为什么有效。这个查询比我原来的查询有什么改进?谢谢。你的查询有很多问题,所以我不会全部讨论。但是对于
MERGE
——您基本上希望编写每个
MERGE
子句,以便它一次最多只能创建一个节点或关系。
MERGE (s:Person {name: t.sender})
MERGE (r:Person {name: t.receiver})
MERGE (trans:Transaction {id: t.id})
SET trans.foo = t.foo
MERGE (s)-[:sends]->(trans)
MERGE (trans)-[:to]->(r);