neo4j - 不要从 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
工作不正常。
解决方案
我建议最好检查节点是否在列表中,并证明该方法,从一个非常简单的示例开始。
这是一个简单的密码,显示了一种方法。然后可以将这种方法扩展到复杂的查询中,
// 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 但可能性能更高......
推荐阅读
- machine-learning - 交叉验证:训练/测试集拆分有必要吗?
- ffmpeg - 如何使(输出文件)取名来自 FFMPEG 中的(输入 mp3 文件)?
- arrays - 删除数组项目反应原生移动项目位置
- python - 数据库不存在(psycopg2.OperationalError)
- r - R - 根据时间顺序的数据聚合多个数据帧
- angular - 如何附加度量单位以插入输入?
- ms-access - 更新查询 - 更新到下一个日期的前一天
- r - CCA:绘制缺少约束变量的图?
- api - Slack Webhook 忽略了我的一些参数
- unit-testing - React 测试库:如何管理重复的测试代码