2011-11-22 47 views
2

我需要使用Python27遍歷neo4j圖。如何用Python爲neo4j定義Traverse?

從我所看到的是我可以定義一個穿越和手動包括計算器和我有類似的東西。

def my_evaluator(path): 
    if (path.end['type'] == 'STOP') or (path.end['type'] == 'BUS_STOP'): 
     return Evaluation.EXCLUDE_AND_CONTINUE 
    else: 
     return Evaluation.INCLUDE_AND_CONTINUE 

def get_passengers_with_bus_stop(db, start_node): 
    nodes = [] 

    traverser = db.traversal()\ 
     .relationships('STOPS_AT', INCOMING)\ 
     .relationships('HAS_BEEN', OUTGOING)\ 
     .evaluator(my_evaluator)\ 
     .traverse(start_node) 

    # Name 
    for n in traverser.nodes.iterator(): 
     nodes.append(n['name']) 

    return nodes 

但是,從返回的節點列表中,我想排除第一個節點,有時停在某些Deepth。

我該如何使用定義de neo4j手冊的遍歷

有時候我找到了一個演示文稿,解釋了另一種定義遍歷的方法,但是這樣不能正確運行,我收到了Python的錯誤消息。我需要安裝其他東西嗎?

class Users(neo4j.Traversal): # Traversals ! queries in Neo4j 
    types = [ neo4j.INCOMING.WORKS_AS,neo4j.OUTGOING.BELONGS_TO] 
    order = neo4j.BREADTH_FIRST 
    stop = neo4j.STOP_AT_END_OF_GRAPH 
    returnable = neo4j.RETURN_ALL_BUT_START_NODE 

我如何定義Neo4j的一個導線用Python來:

  • 排除的第一個節點
  • 停在一些走向深沉

也許我應該用subtraversals?我如何定義它們?

更具體地說,我想在此圖上定義一個遍歷,從節點「我」在這裏到節點「-1」或節點「+1」單獨。該圖定義了關係的方向和它們的名稱。

enter image description here

回答

0

您可以鏈接多個評價者來實現這一目標。要跳過開始節點,添加看起來像這樣的評價:

def exclude_start_node(path): 
    if len(path) == 0: 
     return Evaluation.EXCLUDE_AND_CONTINUE 

    return Evaluation.INCLUDE_AND_CONTINUE 

,並停止在某一給定的深度,這樣的事情:

def stop_at_depth(depth): 
    def evaluator(path): 
     if len(path) >= depth: 
      return Evaluation.INCLUDE_AND_PRUNE 

     return Evaluation.INCLUDE_AND_CONTINUE 
    return evaluator 

你會使用這樣的:

t = db.traverse().evaluator(stop_at_depth(5)).evaluator(exclude_start_node) 

請注意這兩個移動器如何在不「應用」的情況下使用INCLUDE_AND_CONTINUE。鏈接評估人員時,限制最多的評估人員將勝出。因此,如果任何評估者說「EXCLUDE」,當前節點將被排除,如果任何評估者說「PRUNE」,則遍歷將停止當前路徑。

此外,截至上週,最新版本的neo4j嵌入式綁定讓您執行密碼查詢。您可能需要考慮這一點,因爲它可能是一種更簡單的方式來編寫您正在查看的查詢。

http://docs.neo4j.org/chunked/milestone/python-embedded-reference-cypher.html