如何使用Cypher选择特定的重叠模式?

时间:2015-09-05 20:12:27

标签: database neo4j cypher overlapping

我在Neo4j中有一个包含节点和关系的数据集。像这样:

(a)-[r:sel]-(x)
(a)-[r:sel]-(y)
(a)-[r:sel]-(z)
(a)-[r:sel]-(w)
(b)-[r:sel]-(z) 
(b)-[r:sel]-(y)
(c)-[r:sel]-(z)

节点x,y,z和w具有带属性的标签DEP(例如:DEP.type)。 y和z具有相同的属性(DEP.type的定义相同)。

我想只选择(b)等节点,而不选择(a)等节点 换句话说,节点仅在下面写的区域中:

Overlapping

有没有人有任何建议? 祝福,

1 个答案:

答案 0 :(得分:2)

场景1

此查询返回与sel具有a关系的所有节点的集合,当且仅当集合具有多个节点且所有节点具有相同的type值时

MATCH (a)-[r:sel]-(x)
WITH a, COLLECT(x) AS col, LENGTH(COLLECT(DISTINCT x.type)) AS numTypes 
WHERE numTypes = 1 AND LENGTH(col) > 1
RETURN a, col;

场景2

此查询返回与sel具有a关系的所有节点的集合,当且仅当集合具有多个节点且整个集合具有指定值的指定属性时(在此示例中,type = foo)。

MATCH (a)-[r:sel]-(x)
WHERE x.type = 'foo'
WITH a, COLLECT(x) AS col
WHERE LENGTH(col) > 1
RETURN a, col;