用Neo4j确定不同的簇

时间:2018-11-30 15:53:17

标签: neo4j cypher

我有一个密码查询,该查询返回一系列路径,这些路径部分重叠,并导致许多不同的簇。在这种情况下,将存在较小规模(1-50个节点)的适量群集(100-1000个)。完整的数据集通常是几百万个节点(查询提取了总节点的相对较小的子集)。

查询的简化版本如下:

MATCH p=(a:M)-[:F2EDGE]-(b:M) WHERE a.prop > 90 AND b.prop > 90 RETURN p

实际的查询要比中间节点数量可变的查询复杂一些,但这应该可以说明问题。

现在,我想探索该查询生成的不同集群。 我在Connected Components algorithm上找到了似乎正确的文档,但是我看不到如何将其应用于查询结果的路径列表。 我希望能够:

  1. 获取集群列表以及随后的一些基本属性(例如,节点数)
  2. 获取数据,使我将来可以可重复地再次获取该集群(可能是通过获取节点ID或添加链接到每个集群的新“集群”节点)

有人可以建议如何实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

您可以与此同时使用cypher projections

遵循这些原则:

CALL algo.unionFind('
MATCH (a:M) WHERE a.prop > 90 RETURN id(a) as id
UNION
MATCH (b:M) AND b.prop > 90 RETURN id(b) as id
', '
MATCH p=(a:M)-[:F2EDGE]->(b:M) WHERE a.prop > 90 AND b.prop > 90 RETURN id(a) as source, id(b) as target
', {graph:"cypher",write:true, partitionProperty:"partition"})

请注意,在这种情况下,一个节点查询就足够了,因为它们都具有相同的条件,我只想演示如何组合源节点和目标节点上的查询。

如果您想将节点限制为仅连接图中的节点,则也可以将其用作“节点查询”:

MATCH (a:M)-[:F2EDGE]-(b:M) 
WHERE a.prop > 90 AND b.prop > 90 
UNWIND [id(a), id(b)] as id
RETURN distinct id
相关问题