0

我有一张包含优惠和客户的图表。一个客户可以与另一个客户分享一个报价,所以当这种情况发生时,我创建了一个超优势。

(CustomerA)-[:SHARED_OFFER]->(newNode)

(newNode)-[:FOR_OFFER]->(offer)

(newNode)-[:SHARED_WITH]->(customers) (这可以是很多客户)

现在,如果另一个客户 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 共享商品时,此查询正确创建了关系。

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

4

1 回答 1

1

根本不使用create unique,而只是create. 但请记住首先在 start 子句中指定路径中的所有节点,并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)
于 2013-02-14T09:23:57.000 回答