我有节点:(a:charlie)
,(b:economy)
和(c:bicycle)
。我想创建这种模式:
create (a:charlie)-[x:wants_make]->(b:economy)->[y:by_using]->(c:bicycle)
但它给了我笛卡儿的产品。我已经想过跳过创建节点(b)
给予关系[x:want_make]
一个属性。但是节点(b)
在相同的上下文(经济背景)中有许多其他关系。我想得到上面的模式。
有什么建议吗?
答案 0 :(得分:1)
您可能需要稍微分解一下您的查询:
MATCH (a:charlie), (b:economy), (c:bicycle)
MERGE (a)-[:wants_make]->(b), (b)->[:by_using]->(c)
答案 1 :(得分:1)
如果您的查询如下所示:
MATCH (a:charlie), (b:economy), (c:bicycle)
MERGE (a)-[:wants_make]->(b)-[:by_using]->(c);
然后它说这两件事:
wants_make
节点和每个 charlie
节点之间创建economy
关系。by_using
节点和每个 economy
节点之间创建bicycle
关系。左那么,如果charlie
,economy
和bicycle
节点的数量是C,E和B,则会产生(C * E * B)合并,这是笛卡尔积的笛卡尔积。
此外,您的数据模型似乎是错误的。例如,使用Person
标签而不是charlie
标签似乎更为合理。
更合理的查询可能如下所示:
MERGE (a:Person {name: 'Charlie Brown'})
MERGE (c:Bicycle {id: 123})
MERGE (a)-[:wants_make]->(b:Economy)
MERGE (b)-[:by_using]->(c);
此查询通过更具体地了解路径中的第一个和最后一个节点来避免笛卡尔积,并且还避免创建已存在的节点和关系。
而且,更进一步,您可能希望将wants_make
,Economy
和by_using
合并为一个economizes_by_using
关系:
MERGE (a:Person {name: 'Charlie Brown'})
MERGE (c:Bicycle {id: 123})
MERGE (a)-[:economizes_by_using]->(c);