Neo4j 密码查询以查找具有相同关系类型的所有路径

Neo4j 密码查询以查找具有相同关系类型的所有路径,neo4j,cypher,Neo4j,Cypher,我正在努力寻找一个干净、高效的Cypher查询,它可以让我识别从起始节点发出的所有不同路径,这样当存在许多关系类型时,路径中的每个关系都属于相同的类型 以下是该模型的简单版本: CREATE (a), (b), (c), (d), (e), (f), (g), (a)-[:X]->(b)-[:X]->(c)-[:X]->(d)-[:X]->(e), (a)-[:Y]->(c)-[:Y]->(f)-[:Y]->(g) 在此模型

我正在努力寻找一个干净、高效的Cypher查询,它可以让我识别从起始节点发出的所有不同路径,这样当存在许多关系类型时,路径中的每个关系都属于相同的类型

以下是该模型的简单版本:

CREATE (a), (b), (c), (d), (e), (f), (g),
       (a)-[:X]->(b)-[:X]->(c)-[:X]->(d)-[:X]->(e),
       (a)-[:Y]->(c)-[:Y]->(f)-[:Y]->(g)
在此模型中,
(a)
有两种传出关系类型,
X
Y
。我想检索沿关系
X
链接节点的所有路径,以及沿关系
Y
链接节点的所有路径

我可以在cypher之外通过进行一系列查询以编程方式实现这一点,首先 从开始节点检索传出关系的列表,然后为每个关系检索单个查询(作为一个批提交)。这看起来像:

START n=node(1) 
MATCH n-[r]->() 
RETURN COLLECT(DISTINCT TYPE(r)) as rels;
其次是:

START n=node(1) 
MATCH n-[:`reltype_param`*]->() 
RETURN p as path;
以上内容满足了我的需要,但至少需要两次往返服务器(同样,假设我在一个事务中批处理第二组查询)

一种有效但效率极低的单一查询方法是以下单一密码查询:

START n=node(1) 
MATCH p = n-[r*]->() WHERE 
   ALL (x in RELATIONSHIPS(p) WHERE TYPE(x) = TYPE(HEAD(RELATIONSHIPS(p)))) 
RETURN p as path;
该查询使用
ALL
谓词来过滤路径上的关系,以确保路径中的每个关系与路径中的第一个关系匹配。然而,这实际上只是一个过滤器操作,它本质上是所有可能路径的组合爆炸——比首先遍历已知给定类型的关系效率低得多


我觉得用一个密码查询就可以做到这一点,但我一直没能把它做好。

这里有一个小优化,至少不匹配的路径会很快失败:

MATCH n-[r]->() 
WITH distinct type(r) AS t 
MATCH p = n-[r*]->() 
WHERE type(r[-1]) = t // last entry matches
RETURN p AS path
但是,如果您希望Java API真正具有性能,那么这可能是Java API中应该包含的内容之一