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。
我有一个 "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。