在子图上使用算法

时间:2019-10-08 19:00:34

标签: graph neo4j cypher subgraph

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

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

如何对以上结果图运行CALL algo.louvain.stream

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

1 个答案:

答案 0 :(得分:1)

如果您没有找到(或无法解密)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的调用相同的结构来调用algo.louvain as in here;但是,在传递给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。

相关问题