Отправить параметр в запросе neo4j algo - PullRequest
0 голосов
/ 02 января 2019

Я использую Neo4j 3.4.1. Я запустил алгоритм кластеризации и создал кластеры с метками «labelpart». Теперь я хочу для каждого кластера найти узел с наивысшей промежуточностью. Я могу выполнить следующий запрос для конкретного cluster_id, скажем, 3212

CALL algo.betweenness.stream(
  'MATCH (p {labelpart:3212}) RETURN id(p) as id',
  'MATCH (p1 {labelpart:3212})-[]->(p2 {labelpart:3212}) RETURN id(p1) as source, id(p2) as target',
  {graph:'cypher', write: false}
) YIELD nodeId, centrality
RETURN nodeId,centrality order by centrality desc limit 1

Теперь я хочу сделать это программно для всех идентификаторов кластера. Я попытался следующий запрос, используя драйвер болта neo4j для Python:

from neo4j import GraphDatabase, basic_auth

и вот запрос

cluster_id = 3212
query = """
CALL algo.betweenness.stream(
  'MATCH (p {labelpart:{cluster_id}}) RETURN id(p) as id',
  'MATCH (p1 {labelpart:{cluster_id}})-[]->(p2 {labelpart:{cluster_id}}) RETURN id(p1) as source, id(p2) as target',
  {graph:'cypher', write: false}
) YIELD nodeId, centrality
RETURN nodeId,centrality order by centrality desc limit 1
"""
results = session.run(query, parameters = {'cluster_id':cluster_id })

Я получаю следующее сообщение об ошибке

....
ClientError: Failed to invoke procedure `algo.betweenness.stream`: Caused by: org.neo4j.cypher.ParameterNotFoundException: Expected parameter(s): cluster_id

Использование параметра работает для простого запроса, например, Я могу сделать следующее

cluster_id = 3212
query1 = """
MATCH (p {labelpart:{cluster_id}}) RETURN id(p) as id
"""
results = session.run(query1, parameters = {'cluster_id':cluster_id })

Теперь, я думаю, проблема в том, что запросы, в которые мне нужно передать параметры, сами являются параметрами функции algo.betweenness.stream ().

К сожалению, я не смог найти каких-либо указаний о том, как отправить параметр для такого запроса. Возможно, это просто невозможно?

1 Ответ

0 голосов
/ 02 января 2019

@ David, Ваше предположение верно.

Вам нужно написать запрос как:

query = """ CALL algo.betweenness.stream(   'MATCH (p {labelpart:{cluster_id}}) 
 RETURN id(p) as id',
 'MATCH (p1 {labelpart:{cluster_id}})-[]->(p2 {labelpart:{cluster_id}}) RETURN id(p1) 
as source, id(p2) as target',
{graph:'cypher', write: false, params:{cluster_id:{ext_parameter_name}}}
) YIELD nodeId, centrality RETURN nodeId,centrality order by
centrality desc limit 1 """

ext_parameter_name - это параметрна сессию.(Использовать другое имя, чтобы избежать путаницы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...