我有一个带有“id”属性数组的节点:
node 1: {id:[1,2,3]}
node 2: {id:[3,4,5]}
node 4: {id:[6,7,8]}
我想要一个查询来匹配ID属性数组中至少有一个公共值的节点对;例如,我正在寻找的查询将仅返回节点1,节点2(它们的共同值为“3”)。
我试过这个,但它对我不起作用:
MATCH (n), (m) where FILTER(x IN n.id WHERE x IN m.id) return n,m;
谢谢!
答案 0 :(得分:3)
实际上,您的原始查询应该会返回一些结果。
以下是该查询的改进版本:
MATCH (n), (m)
WHERE ID(n) < ID(m) AND ANY(x IN n.id WHERE x IN m.id)
RETURN n, m;
ANY
功能,一旦找到匹配就会退出。请参阅此console。
答案 1 :(得分:1)
这有点令人费解,但似乎有效:
MATCH n, m
WHERE ID(n)< ID(m)
WITH n, n.id AS n_ids, m, m.id AS m_ids
UNWIND n_ids AS n_id
UNWIND m_ids AS m_id
WITH n, m, n_id, m_id
WHERE n_id = m_id
RETURN n, m
如果这对您没有意义,我建议您尝试将每个WITH
更改为RETURN
,然后删除所有内容以查看每个步骤的结果。
编辑:你也可以这样缩短一点:
MATCH n, m
WHERE ID(n)< ID(m)
WITH n, n.id AS n_ids, m, m.id AS m_ids
UNWIND n_ids AS n_id
WITH n, m, n_id, m_ids
WHERE n_id IN m_ids
RETURN n, m
(对于更大的数据集,最后可能需要DISTINCT
)