Neo4j:如何匹配 属性 数组中具有共同值的节点

Neo4j : how to match nodes that have a common value in a property array

我有一个 "id" 属性 数组的节点:

node 1: {id:[1,2,3]}
node 2: {id:[3,4,5]}
node 4: {id:[6,7,8]}

我想要一个查询来匹配 ID 属性 数组中至少有一个共同值的节点对;例如,我正在寻找的查询将 return 只有节点 1、节点 2(它们的共同值是“3”)。

我已经试过了,但它对我不起作用:

MATCH (n), (m) where FILTER(x IN n.id WHERE x IN m.id) return n,m;

谢谢!

这有点复杂,但似乎可行:

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

实际上,您的原始查询应该返回一些结果。

这是该查询的改进版本:

MATCH (n), (m)
WHERE ID(n) < ID(m) AND ANY(x IN n.id WHERE x IN m.id)
RETURN n, m;
  • 它通过按 ID 对节点进行排序来避免重复结果。
  • 它使用 ANY 函数,一旦找到匹配项就会退出。

看到这个console