如何编写密码查询来创建超边界?

时间:2013-02-13 12:21:51

标签: neo4j cypher

我有一个包含优惠和客户的图表。客户可以与其他客户共享优惠,所以当发生这种情况时,我会创建一个超级优势。

(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,因此尝试一次完成而不是部分完成。

1 个答案:

答案 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)