在 neo4j 算法查询中提交参数



我正在运行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

现在,我想以编程方式为所有集群 ID 执行此操作。我尝试使用适用于 python 的 neo4j bolt 驱动程序进行以下查询:

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() 函数的参数。

不幸的是,我找不到有关如何为此类查询提交参数的任何说明。也许这是不可能的?

@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 是 session.run 的参数。(使用不同的名称以避免混淆)。

最新更新