Neo4j 如何编写密码查询来创建超边?
我有一张包含报价和客户的图表。一个客户可以与另一个客户共享一个产品,因此当这种情况发生时,我会创建一个hyperedge (CustomerA)-[:共享\u优惠]->(新节点) (newNode)-[:FOR_OFFER]->(OFFER) (newNode)-[:与]->(客户共享)(这可能是许多客户) 现在,如果另一个客户B与其他客户共享相同的报价,我希望创建一个新节点来表示这种关系。 有没有办法在一个密码查询中完成这一切 我正在使用:Neo4j 如何编写密码查询来创建超边?,neo4j,cypher,Neo4j,Cypher,我有一张包含报价和客户的图表。一个客户可以与另一个客户共享一个产品,因此当这种情况发生时,我会创建一个hyperedge (CustomerA)-[:共享\u优惠]->(新节点) (newNode)-[:FOR_OFFER]->(OFFER) (newNode)-[:与]->(客户共享)(这可能是许多客户) 现在,如果另一个客户B与其他客户共享相同的报价,我希望创建一个新节点来表示这种关系。 有没有办法在一个密码查询中完成这一切 我正在使用: start c=node:node_auto_ind
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)
这是第一次有效。请参阅控制台:
当C1与C2共享报价时,此查询正确创建了关系
当C2现在与C3共享时,执行查询会导致重复使用同一个节点——这不是我想要的。应该有一个从C2创建的新节点,该节点具有共享的_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,因此尝试一次性完成,而不是部分完成。只是不使用
create unique
,只使用create
。但请记住,首先在start子句中指定路径中的所有节点,并始终保持paramsharedOffer
未指定,以便create命令将仅创建未指定的元素
更新使用创建
而不是创建唯一的
,并对现有关系进行筛选(或使用两个查询-一个用于检查是否已存在具有C1的sharedOffer,另一个用于更新具有C3的sharedOffer):
如果我使用justcreate,那么C2与C3的共享就像预期的那样工作。但是,现在对C1和C3执行相同的创建操作,并创建一个新的共享报价节点,而不是重复使用第一个C1->C2共享中的节点。这就是为什么我最终得到了unique:-)另外--你能澄清一下你不指定sharedOffer是什么意思吗?我没有尝试过过滤器-这是一个有趣的想法。上述查询满足某些情况,但不幸的是,并非所有情况都满足。类似于如果C1已经与C2共享了O1,那么与C3共享O1的C1应该重用现有的共享提供,并且只创建到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)