我正在运行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螺栓驱动程序尝试了以下查询:
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()函数的参数。
不幸的是,我找不到有关如何为此类查询提交参数的任何说明。也许只是不可能?
答案 0 :(得分:3)
@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的参数。 (使用其他名称以避免混淆)。