请教:这样的场景下的查询怎么写,多谢!
发布于 8 个月前 作者 realyin 269 次浏览 来自 问答

我用某个城市的新冠病例建了一个数据库,Node分成了3类,分别为:确诊病例:confirmed,无症状病例:asymptomatic,病例去过的地点:adress,在adress的属性中,我增加一个:num_of_related,代表有多少个病例来过这个地点。并建立了两种病例和去过的地点的关系。 match p=(m)-[r]-(a:adress) return p,结果如下:

image.png

现在,我有两个问题想请教大家,请各位指点! 1、查询所有病例,以及这些病例去过的地点,但不包括只有一个病例去过的地点。我现在只能把这些病例(去过多个地点,但这些地点只有这个病例去过)找出来,如下: match p=(m)-[]-(a:adress) with m,collect(a.num_of_related) as person_count where all (t1 IN person_count WHERE t1=1) return m.name 所有的病例怎么查,没有想出来,请各位指导,谢谢!

2、获取数据中的子图数量,即传播链个数,这个没想出来怎么写。。。

谢谢各位指点!

4 回复

第一个问题已经解决了: match (n1:person)-[]-(a:track) with n1,collect(a.num_of_related) as adc where all( t1 in adc where t1=1) match (n:person)-[]-(b:track) where n1.name=n.name return n1,b union all match (n1:person)-[]-(b:track) where b.num_of_related>1 return n1,b

但有个问题,把两个match掉换顺序时,查询出错: match (n:person)-[]-(b:track) match (n1:person)-[]-(a:track) with n1,collect(a.num_of_related) as adc where all( t1 in adc where t1=1) where n1.name=n.name return n1,b union all match (n1:person)-[]-(b:track) where b.num_of_related>1 return n1,b 报错: Invalid input ‘h’: expected ‘i/I’ (line 3, column 2 (offset: 139)) “where n1.name=n.name return n1,b” ^

这种情况怎么处理呢?

下面的查询仅供参考,请根据自己的数据模型情况做修改:

1、查询所有病例,以及这些病例去过的地点,但不包括只限定病例去过的地点

//获取地点
MATCH (adr:Adress) 
  WITH adr
//获取该地点确诊病例
MATCH (adr)<--(cfm:Confirmed)
  WITH adr,COLLECT(cfm) AS cfmList
//获取该地点无症状病例
MATCH (adr)<--(ast:Asymptomatic)
  WITH adr,cfmList,COLLECT(ast) AS astList
//统计人数
WITH adr,cfmList,
  SIZE(cfmList) AS cfmListSzie,
  astList
  SIZE(astList) AS astListSzie
//根据病例数过滤
//确诊病例数小于2,且无症状装病例大于10的地点
WHERE cfmListSzie<2 AND astListSzie>10
//输出该地点,以及确诊病例,无症状病例
RETURN adr,cfmListm,astList

2、获取数据中的子图数量,即传播链个数

  • 如果是求连通图可以使用WCC和SCC算法,apoc或者algo(gds)有对应算法可以求解
  • 如果是求满足图模式的子图个数可以直接使用Cypher模式匹配语句统计,案例如下:
MATCH 
  path0 = (n1)<-[r1]-(n2)-[r2]-(n3),
  path1 = (n1)-[r4]->(n2),
  path2 = (n1)-[r5]->(n3)
WITH [path0, path1, path2] AS graph
RETURN COUNT(*) AS graphCount

收到回复,非常感谢指点!

还有两个问题希望能够再帮忙看看: 1、还是关于子图数量的统计,我想统计的是连通图的数量,不过您提到的WCC,SCC,apoc等算法,我都没有搞定,能否举个具体的例子呢? 2、像下面这种写法,我本是想第一个where和第二个match配对,第二个where是对前面两个match进行关联,直接执行时会报错,不过调换两个match的顺序后,能够执行成功。如果想在不调整顺序的情况下,把下面的语句执行成功,该怎么修改呢? match (n:person)-[]-(b:track) match (n1:person)-[]-(a:track) with n1,collect(a.num_of_related) as adc where all( t1 in adc where t1=1) where n1.name=n.name return n1,b union all match (n1:person)-[]-(b:track) where b.num_of_related>1 return n1,b

非常感谢您的指导 !

使用apoc.path.subgraphNodes解决了这个问题: MATCH (a:person)-[r]->() WITH a
CALL apoc.path.subgraphNodes(a, {maxLevel:-1}) YIELD node WITH node,a where ‘person’ in labels(node) SET node.component = id(a) with node.component as com,collect(distinct node.name) as nodlist return com,size(nodlist),nodlist order by size(nodlist) desc

回到顶部