首页 > 解决方案 > 不要从 Cypher 中的特定路径返回节点集

问题描述

我正在尝试从 2 个会话返回一组节点,条件是返回的节点不应出现在另一个会话(第三个会话)中。我正在使用以下代码,但它没有按预期工作。

MATCH (:Session {session_id: 'abc3'})-[:HAS_PRODUCT]->(p:Product)        

UNWIND ['abc1', 'abc2'] as session_id
MATCH (target:Session {session_id: session_id})-[r:HAS_PRODUCT]->(product:Product)
where p<>product

WITH distinct product.products_id as products_id, r
RETURN products_id, count(r) as score
ORDER BY score desc

该查询应该返回存在于abc1 & abc2但不存在于 中的所有节点abc3。此查询不排除 中存在的所有产品abc3。有什么办法可以让它工作吗?

更新1: 我试图简化它而不是UNWIND这样

match (:Session {session_id: 'abc3'})-[:HAS_PRODUCT]->(p:Product)
MATCH (target:Session {session_id: 'abc1'})-[r:HAS_PRODUCT]->(product:Product)
where product <> p
WITH distinct product.products_id as products_id
RETURN products_id

即使这样也行不通。它返回所有存在的项目abc1而不删除那些已经存在的项目abc3。好像where product <> p工作不正常。

标签: neo4jcypherredisgraph

解决方案


我建议最好检查节点是否在列表中,并证明该方法,从一个非常简单的示例开始。

这是一个简单的密码,显示了一种方法。然后可以将这种方法扩展到复杂的查询中,

// get first two product IDs as a list
MATCH (p:Product)
WITH p LIMIT 2
WITH COLLECT(ID(p)) as list
RETURN list

// now show two more product IDs which not in that list
MATCH (p:Product)
WITH p LIMIT 2
WITH COLLECT(ID(p)) as list
MATCH (p2:Product)
WHERE NOT ID(p2) in list
RETURN ID(p2) LIMIT 2

注意:我使用的是节点的 ID() 而不是整个节点,相同的 dbhits 但可能性能更高......


推荐阅读