首页 > 解决方案 > 如何在 CYPHER 中编写此 SQL 查询?

问题描述

这是以下 SQL 查询

select count(distinct Descendent_id) from
(
select * 
from v.ABC a
left join v.XYZ b
on a.Target_id=b.Ancestor_id
) t
where t.Target_id = 1234;

编辑

两个表/节点之间实际上没有关系。我来解释——

假设表 B 有Ancestor_IdDescendent_id,它们之间有某种关系,我们可以称之为 [children]

Ancestor_Id - 101 --[children]--> Descendent_Id - 101.1

Ancestor_Id - 101 --[children]--> Descendent_Id - 101.2


表 A 只有与表 B 相同的Target_Id ,例如 - 表 A - Target_Id = 101 | 表 - B Ancestor_Id = 101

笔记 -

表 A 与表 B 没有任何关系。

所以我需要用Target_Id 和 Ancestor_ID加入两个表/节点,最终我想要的是表 B 中的Descendent_Id的 DISTINCT COUNT,它与 Ancestor_Id 有 [children] 关系。


如果您可以从 SQL 查询中看到 Descendent_id 没有像 b.Descendent 那样预先附加任何别名,我如何在 Neo4j 中实现相同的效果。


请让我知道如果我仍然没有正确地清除疑问。

我是 CYPHER 的新手 - Neo4j,请帮助!

标签: mysqlsqljoinneo4jcypher

解决方案


[更新]

以下 Cypher 将获取具有指定 ID 的节点的“左连接”中不同值的D_id数量。abcxyz

MATCH (a:abc) WHERE a.id = $id
OPTIONAL MATCH (b:xyz) WHERE b.abc_id = $id
WITH COLLECT(a.D_id)+COLLECT(b.D_id) AS ids
UNWIND ids AS id
RETURN COUNT(DISTINCT id) AS D_id_count

我假设abc节点将 ID 存储在id属性中,xyz节点将其存储在abc_id属性中。我还假设所需的 ID 值作为id 参数传递。

注意:如果您在以下位置创建索引,此查询会更快:

  • :abc(id)
  • :xyz(abc_id)

推荐阅读