我需要使用Python27遍历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
但是从返回的节点列表中我想要排除第一个节点,有时会停在某个Deepth。
如何使用定义de neo4j手册的 Traversals 来做到这一点?
有时我发现了一个演示文稿,解释了定义 Traversals 的另一种方法,但是这种方法运行不正常,我从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定义Traverse:
也许我应该使用 subtraversals ?我该如何定义它们?
更具体地说,我想在此图上定义一个 Traversal ,以便从“我在这里”节点转到节点“-1”或节点“+1”。该图定义了关系的de方向及其名称。
答案 0 :(得分: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