我有一个包含优惠和客户的图表。客户可以与其他客户共享优惠,所以当发生这种情况时,我会创建一个超级优势。
(CustomerA) - [:SHARED_OFFER] - GT;(newNode)
(newNode) - [:FOR_OFFER] - GT;(报价)
(newNode) - [:SHARED_WITH] - >(客户)(这可能是很多客户)
现在,如果另一个客户B与他人共享相同的报价,我希望创建一个新节点来表示这种关系。 有没有办法在一个Cypher查询中完成所有这些?
我正在使用:
start c=node:node_auto_index(name="C1"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C2")
create unique c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)
这是第一次有效。请访问控制台:http://console.neo4j.org/r/76no2g 当C1与C2共享Offer时,此查询正确创建了关系。
当C2现在与C3共享Offer时,执行查询导致同一节点被重用 - 这不是我想要的。应该有一个从C2创建的具有SHARED_OFFER关系的新节点。这是查询:
start c=node:node_auto_index(name="C2"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C3")
create unique c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)
感谢任何帮助。 注意:我正在使用1.8.1 REST,因此尝试一次完成而不是部分完成。
答案 0 :(得分:1)
根本不要使用create unique
,而只使用create
。但是请记住首先在start子句中指定路径中的所有节点,并保持param sharedOffer
始终未指定,因此create命令将仅创建未指定的元素。
更新使用create
代替create unique
并过滤现有关系(或使用2个查询 - 一个用于检查sharedOffer是否已存在于C1中,第二个用于更新sharedOffer与C3):
START c=node:node_auto_index(name="C1"), o=node:node_auto_index(name="Offer"), sharedCustomer=node:node_auto_index(name="C2")
WHERE not(c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o))
CREATE c-[:SHARED_OFFER]->(sharedOffer)-[:FOR_OFFER]->(o), (sharedOffer)-[:SHARED_WITH]->(sharedCustomer)