2017-02-25 67 views
3
MATCH (u:User {name:{user}}), (target:Group {name: {group}}), p=shortestPath((u)-[*]->(target)) RETURN p 

當我在Neo4j Web UI中運行上述查詢時,會顯示生成路徑的下降圖。如何使用neo4j-python獲取未知長度路徑中的所有跳數?

然而,當我運行與neo4j-python司機相同的查詢,只有一個Path對象以有限的信息返回

<Path start=479557 end=404582 size=1> 

如何使用Cypher和Python來獲取完整路徑的詳細信息,包括所有的節點和連接它們的關係?

+1

Path對象應該擁有所有的關係,它實際上是一個關係的迭代器,請看這裏:https://github.com/neo4j/neo4j-python-driver/blob/1.2/neo4j/v1/types.py #L248 –

+0

謝謝!我將提交一份PR,以使文檔更清晰地表明http://neo4j.com/docs/api/python-driver/current/types.html#neo4j.v1.Path –

回答

4

取決於你想如何返回數據,但你可以嘗試這樣的事情

MATCH (u:User {name:{user}}), (target:Group {name: {group}}), 
p=shortestPath((u)-[*]->(target)) RETURN nodes(p),relationships(p) 
+0

謝謝!這非常有幫助。有沒有辦法像鏈接列表一樣返回關係,所以我不需要手動將關係映射回節點就可以得到像這樣的東西? 'n1 - [r1] - > n2-> n3- [r2] -n4' –

+1

是的,您可以直接返回路徑。 –

2

感謝您的幫助大家!作爲參考,這裏是我的完整示例,它將路徑轉換爲控制檯或電子郵件輸出的可讀字符串。

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 

這是由Bloodhound項目,它建立的Active Directory結構的圖形生成的圖形查詢。它對域管理員,系統架構師,網絡維護者和筆試者非常有用。

相關問題