问题描述
我试图从 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
工作不正常。
解决方法
我建议最好检查节点是否在列表中,并从一个非常简单的例子开始证明该方法。
这是一个简单的密码,展示了一种方法。然后可以将此方法扩展到复杂查询中,
// 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 但可能性能更高......