Neo4j 如何在Cypher中不返回不同列中的相同节点

Neo4j 如何在Cypher中不返回不同列中的相同节点,neo4j,cypher,Neo4j,Cypher,我试图在这个查询中不在单独的列中两次返回同一个节点 START n=node:nodes(customer = 'c2') MATCH n-[:OWNS]->owned-[:CROSS_SELL|UP_SELL]->sell RETURN distinct n.customer,owned.product,sell.product 客户C2拥有产品P1和P2。产品P2和P3可以从产品P1交叉销售。产品P3也可以从产品P2向上销售 查询将正确返回 C2 P1 P3 C2 P2 P3

我试图在这个查询中不在单独的列中两次返回同一个节点

START n=node:nodes(customer = 'c2')
MATCH n-[:OWNS]->owned-[:CROSS_SELL|UP_SELL]->sell
RETURN distinct n.customer,owned.product,sell.product
客户C2拥有产品P1和P2。产品P2和P3可以从产品P1交叉销售。产品P3也可以从产品P2向上销售

查询将正确返回

C2 P1 P3
C2 P2 P3
C2 P1 P2
因为客户已经拥有P2,所以我不想要结果中的最后一条记录

我怎样才能做到这一点


谢谢

我还没有测试来验证这是否有效,但它在逻辑上似乎是正确的:

START n=node:nodes(customer = 'c2')
MATCH n-[:OWNS]->owned-[:CROSS_SELL|UP_SELL]->sell,
      alreadyOwns = n-[:OWNS]->sell
WHERE COUNT(alreadyOwns) = 0
RETURN distinct n.customer,owned.product,sell.product

基本上,我的想法是尝试从开始节点到交叉/向上销售的商品找到一个直接匹配项,如果找到了路径,则不包括该路径。

我还没有测试以验证这是否有效,但它似乎在逻辑上是正确的:

START n=node:nodes(customer = 'c2')
MATCH n-[:OWNS]->owned-[:CROSS_SELL|UP_SELL]->sell,
      alreadyOwns = n-[:OWNS]->sell
WHERE COUNT(alreadyOwns) = 0
RETURN distinct n.customer,owned.product,sell.product

基本上,我们的想法是尝试找到从开始节点到交叉/向上销售商品的直接匹配,如果找到了路径,则不包括它。

只需添加一个条件,过滤C2和P2之间的关系即可

START n=node:nodes(customer = 'c2')
MATCH n-[:OWNS]->owned-[:CROSS_SELL|UP_SELL]->sell
WHERE not(n-[:OWNS]-sell)
RETURN distinct n.customer,owned.product,sell.product

只需添加一个条件,过滤C2和P2之间的关系

START n=node:nodes(customer = 'c2')
MATCH n-[:OWNS]->owned-[:CROSS_SELL|UP_SELL]->sell
WHERE not(n-[:OWNS]-sell)
RETURN distinct n.customer,owned.product,sell.product

谢谢你的帮助。这看起来很好。+1,但您可能应该在谓词
not(n-[:OWNS]->sell)
(这不是另一种方式)。谢谢您的帮助。这看起来很好。+1,但您可能应该在谓词
not(n-[:OWNS]->sell)
(这不是另一种方式)。谢谢您的帮助。看起来很棒。谢谢你的帮助。这看起来很棒。