如何用Python定义Neo4j的遍历?
我需要用Python 2.7来遍历一个neo4j图。
从手册中我看到可以定义一个遍历,并且可以包含一个评估器,我做了类似的事情。
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
但是从返回的节点列表中,我想排除第一个节点,有时候还想在某个深度停止。
我该如何使用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
我该如何用Python为neo4j定义一个遍历,以:
- 排除第一个节点
- 在某个深度停止
也许我应该使用子遍历?我该如何定义它们呢?
更具体地说,我想在这个图上定义一个遍历,从节点“我在这里”到节点“-1”或节点“+1”。这个图定义了关系的方向和名称。
1 个回答
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。当你串联评估器时,限制最严格的评估器会优先生效。所以如果有任何一个评估器说“排除”,当前节点就会被排除;如果有评估器说“修剪”,遍历就会在当前路径停止。
另外,从上周开始,最新版本的neo4j嵌入式绑定允许你执行cypher查询。你可能想了解一下,因为这可能是编写你正在查看的查询的更简单的方法。
http://docs.neo4j.org/chunked/milestone/python-embedded-reference-cypher.html