我想执行无向遍历以提取通过某种类型的关系连接的所有 id
当我执行以下查询时,它返回的值足够快
MATCH path=(s:Node {entry:"a"})-[:RelType*1..10]-(x:Node)
RETURN collect(distinct ID(x))
然而做
MATCH path=(s:Node {entry:"a"})-[:RelType*]-(x:Node)
RETURN collect(distinct ID(x))
需要大量的时间。我怀疑通过使用
*
它搜索从 s 到 x 的每条路径,但由于我只想要 id,这些路径可以被丢弃。我真正想要的是 BFS 或 DFS 搜索以从 s 中查找连接节点。两个查询都返回完全相同的结果,因为没有最短路径大于 5 的元素(仅在测试示例中!)。
最佳答案
您是否为 create index on :Node(entry)
添加了索引? ?
还取决于路径中每个节点的 rels 数,您会通过可能返回的图形获得 rels^10(或一般 rels^steps)路径。
您可以先尝试使用较小的上限,例如 3,然后从那里开始工作吗?
离开方向真的很痛苦,因为你会得到周期。
您还可以尝试做的是:
MATCH path=(s:Node {entry:"a"})-[:RelType*]->(x:Node)
RETURN ID(X)
并流式传输结果并在客户端中执行唯一性
或者如果你不想在客户端做唯一性
MATCH path=(s:Node {entry:"a"})-[:RelType*]->(x:Node)
RETURN distinct ID(X)
关于performance - Neo4j 遍历性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22459807/