neo4j使用cypher查询路径避免出现环路



neo4j在使用可变长路径找两个点之前的所有路径时,会返回包含环路的路径(一个点在路径中出现两次),如下面的语句:

MATCH path = (x)-[:KNOWS*]-(y)
  
  
 
 

可能返回a->b->c->d->b->e这样的路径,如图:


解决方法:

纯cypher实现


   
   
  
  
  1. MATCH path = (x)-[:KNOWS*]-(y)
  2. UNWIND NODES(path) AS n
  3. WITH path,
  4. SIZE(COLLECT( DISTINCT n)) AS testLength
  5. WHERE testLength = LENGTH(path) + 1
  6. RETURN path

使用apoc


   
   
  
  
  1. MATCH path = (x)-[ :KNOWS*]-(y)
  2. WHERE SIZE(apoc.coll.toSet(NODES(path))) = LENGTH(path) + 1
  3. RETURN path

或者也可以这样:


   
   
  
  
  1. MATCH path = (x)-[ :KNOWS*]-(y)
  2. WHERE apoc.coll.duplicates(NODES(path)) = []
  3. RETURN path

本文链接:https://blog.csdn.net/wry2008wry/article/details/80899860


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM