我有一个使用的Java(Spring Neo4j)调用的密码查询,该查询有效。
基本查询很简单-它询问哪些节点通向另一个节点。
挑战的要点在于,查询可能需要使用一组(三个)项-contributor
,tag
和source
-来筛选其结果。
其中两个-tag
和source
-带来了需要测试的关系。但是,如果未提供这些内容,则无需测试这种关系。
新浏览器警告我,我正在使用的查询效率低下,原因可能很明显:
@Query("MATCH (p:BoardPosition)<-[:PARENT]-(n:BoardPosition)<-[:PARENT*0..]-(c:BoardPosition),
(t:Tag), (s:JosekiSource) WHERE
id(p)={TargetID} AND
({ContributorID} IS NULL or c.contributor = {ContributorID}) AND
({TagID} IS NULL or ((c)-->(t) AND id(t) = {TagID}) ) AND
({SourceID} IS NULL or ((c)-->(s) AND id(s) = {SourceID}) )
RETURN DISTINCT n"
)
List<BoardPosition> findFilteredVariations(@Param("TargetID") Long targetId,
@Param("ContributorID") Long contributorId,
@Param("TagID") Long tagId,
@Param("SourceID") Long sourceId);
(为清楚起见,从代码中删除了Java多行查询字符串分类)
如果可以将条件测试的条件包含在MATCH子句本身中,那么这样做会更有效率。但这似乎是不可能的。
有没有可以提高这种效率的加密方式?
FWIW:Neo4j浏览器警告为:
此查询在断开连接的模式之间建立笛卡尔积。 如果查询的一部分包含多个断开连接的模式,则此 将在所有这些部分之间建立笛卡尔积。这可能 产生大量数据并减慢查询处理。