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

时间:2015-04-28 15:59:11

标签: neo4j cypher

我有一个带有“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;

谢谢!

2 个答案:

答案 0 :(得分:3)

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

以下是该查询的改进版本:

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

答案 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