我正在尝试使用 graphrepository 在 spring-neo4j 中创建一个应用程序。其中一个要求是在两个子节点之间找到一个最低公共祖先 (lca)。
目前我使用以下查询来实现这一点:
@Query("MATCH path = (c1:Concept)-[r:Relation*{type: 'Is a'}]->(ca:Concept)<-[r:Relation*{type: 'Is a'}]-(c2:Concept)
WHERE c1.conceptID = {conceptId1} AND c2.conceptID = {conceptId2}
RETURN ca ORDER BY length(path) LIMIT 1")
Concept findLowestCommonAncestor(@Param("conceptId1") Long conceptId1, @Param("conceptId2") Long conceptId2);
这里的问题是性能。最初我的图表由 330 000 个节点和 2 000 000 个关系组成。我感兴趣的关系是具有类型的关系:“Is a”。它们仅在树中向上移动(连接子节点与父节点)。最大向上距离为 3。
这是树结构:
因为我有几个像这样的树结构,所以我决定添加一个根节点,将所有不同的树结构连接在一起。以便始终找到 lca。但是添加这个根节点极大地改变了我的性能:从 558 毫秒到 562286 毫秒
我知道添加根节点会影响性能,但它不应该这么多,对吧?如果是这样,是否有更好的方法来计算 lca?
我认为我的密码查询只会在树中向上查找节点。所以在这种情况下,添加一个额外的根节点不应该对性能产生这么大的影响。