如何使用neo4j-python获取未知长度路径中的所有跃点?

Sea*_* W. 4 python neo4j

MATCH (u:User {name:{user}}), (target:Group {name: {group}}), p=shortestPath((u)-[*]->(target)) RETURN p
Run Code Online (Sandbox Code Playgroud)

当我在Neo4j Web UI中运行上述查询时,将显示结果路径的下降图。

但是,当我使用neo4j-python驱动程序运行相同的查询时,仅Path返回信息有限的对象

<Path start=479557 end=404582 size=1>
Run Code Online (Sandbox Code Playgroud)

如何使用Cypher和python获取完整的路径详细信息,包括所有节点以及连接它们的关系?

Tom*_*nič 5

取决于您要如何返回数据,但是您可以尝试这样的操作

MATCH (u:User {name:{user}}), (target:Group {name: {group}}),
p=shortestPath((u)-[*]->(target)) RETURN nodes(p),relationships(p)
Run Code Online (Sandbox Code Playgroud)


Sea*_* W. 5

感谢大家的帮助!作为参考,这是我的完整示例,它将路径转换为人类可读的字符串以用于控制台或电子邮件输出。

def find_paths_from_standard_user_to_domain_admins(standard_user, domain_admins_group):
    """Returns a list of paths that a standard user could take to get domain admin credentials"""
    results = []
    query = "MATCH (u:User {name:{user}}), (target:Group {name: {group}})," \
            "p=allShortestPaths((u)-[*]->(target)) RETURN p"
    with driver.session() as session:
        with session.begin_transaction() as tx:
            for record in tx.run(query, user=standard_user, group=domain_admins_group):
                relationships = record["p"].relationships
                nodes = record["p"].nodes
                path = ""
                for i in (range(len(relationships))):
                    path += "{0}-[{1}]->".format(nodes[i]["name"], relationships[i].type)
                path += nodes[-1]["name"]
                results.append(path)
    return results
Run Code Online (Sandbox Code Playgroud)

这是对Bloodhound项目生成的图的查询,该项目构建 Active Directory 结构的图。它对于域管理员、系统架构师、网络防御者和渗透测试人员非常有用。