假设我有以下子图(或视图):
MATCH(n:Person)-[]->(m:Person) RETURN n, m;
如何对以上结果图运行CALL algo.louvain.stream
?
此外,我如何在algo.scc
找到的每个社区上运行algo.louvain
?
答案 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。