在子图上使用算法

Use algo on Subgraph

假设我有以下子图(或视图):

MATCH(n:Person)-[]->(m:Person) RETURN n, m;

我怎么能运行CALL algo.louvain.stream反对上面的结果图呢?

此外,我如何 运行 algo.scc 在每个社区中找到 algo.louvain

如果您没有找到(或无法破译)the Neo4j docs,这里提供了示例:

CALL algo.louvain(
  'MATCH (p:User) RETURN id(p) as id',
  'MATCH (p1:User)-[f:FRIEND]-(p2:User)
   RETURN id(p1) as source, id(p2) as target, f.weight as weight',
  {graph:'cypher',write:true});

文档没有明确说明,但传递给 algo.louvain 的第一个查询指定了 algo.louvain 要考虑的节点集合,第二个查询指定了节点之间的关系(或连接到查询 1 中指定的节点。

这意味着您将必须指定您在问题中提到的空方括号之间的任何关系类型。如果没有连接节点的东西,该算法将不会 运行 — 没有顶点的边,毕竟它不是图。

此外,复制 RETURN id(p1) as source, id(p2) as target 至关重要 重要,无论您的第二个查询的形状是什么,否则 Java 将抛出一个错误。

最后,对于每个社区运行宁algo.scc,您需要修改上述查询,将配置中的writeProperty指定为algo.louvain.一旦该查询 运行 成功,在 algo.louvain 运行 中考虑的每个节点将有一个 0、1、2 等值作为您指定的 属性 .然后,对于这些社区中的每一个,您可以调用 algo.scc as in here,其结构与上述对 algo.louvain 的调用相同;然而,在传递给 algo.scc 的第一个查询中,您将指定您所关注的社区。例如(这是根据您的问题即兴创作的,而不是来自文档):

// strongly-connected components for community 0
CALL algo.scc(
  'MATCH (n:Person {algo.louvain.writeProperty here: 0}) RETURN id(n) as id',
  'MATCH (n:Person)-[k:KNOWS]->(m:Person)
   RETURN id(n) as source, id(m) as target',
  {graph:'cypher',write:true,writeProperty:'partition'})
  YIELD loadMillis, computeMillis, writeMillis, setCount, maxSetSize, minSetSize

然后,按照文档的建议,您可以找到最大的分区如下:

MATCH (u:Person)
RETURN u.partition as partition,count(*) as size_of_partition
ORDER by size_of_partition DESC
LIMIT 1;

或以您选择的任何方式进一步查询您的(子)图,因为算法的结果被写为 Person 节点上的属性。 HTH.