Использовать алгоритм на подграфе - PullRequest
0 голосов
/ 08 октября 2019

Допустим, у меня есть следующий подграф (или представление):

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

Как я могу запустить CALL algo.louvain.stream для приведенного выше графа результатов?

И далее, какМогу ли я запустить algo.scc в каждом сообществе найти по algo.louvain?

1 Ответ

1 голос
/ 11 октября 2019

Если вы не нашли (или не смогли расшифровать) документы Neo4j , вот пример, приведенный ниже:

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.

Thisозначает, что вам нужно будет указать любой тип отношения между пустыми квадратными скобками, которые вы упомянули в вопросе. Алгоритм не будет работать без чего-либо для соединения узлов - без ребер к вершинам, в конце концов, это не граф.

Кроме того, крайне важно важно для репликации RETURN id(p1) as source, id(p2) as target бит, независимо от формы вашего второго запроса, в противном случае Java выдаст ошибку.

Наконец, с точки зрения запуска algo.scc для каждого сообщества, вам нужно изменить приведенный выше запрос, чтобыукажите writeProperty в конфигурации для algo.louvain. После успешного выполнения этого запроса каждый узел, который был рассмотрен в ходе выполнения algo.louvain, будет иметь значение 0, 1, 2 и т. Д. В качестве указанного вами свойства. Затем для каждого из этих сообществ вы можете позвонить algo.scc , как здесь с той же структурой, что и вышеупомянутый вызов 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. НТН.

...