如何为Spring Neo4j查询在cypher中实现条件关系子句?

时间:2019-06-25 07:09:36

标签: spring-boot neo4j cypher

我有一个使用的Java(Spring Neo4j)调用的密码查询,该查询有效。

基本查询很简单-它询问哪些节点通向另一个节点。

挑战的要点在于,查询可能需要使用一组(三个)项-contributortagsource-来筛选其结果。

其中两个-tagsource-带来了需要测试的关系。但是,如果未提供这些内容,则无需测试这种关系。

新浏览器警告我,我正在使用的查询效率低下,原因可能很明显:

@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浏览器警告为:

  

此查询在断开连接的模式之间建立笛卡尔积。   如果查询的一部分包含多个断开连接的模式,则此   将在所有这些部分之间建立笛卡尔积。这可能   产生大量数据并减慢查询处理。

0 个答案:

没有答案