Neo4j查询具有2个关系的节点集,并为每个关系节点设置值

yeotifhr  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(163)

我已经得到了这个查询工作:

  1. MATCH (doc:Captions)-[:HAS_CATEGORY]-(c:Categories {id: 'ne0MtinOO6DXryRvqMxS'})
  2. MATCH (doc:Captions)-[:HAS_PILLAR]-(p:Pillars {name: 'Feel Good'})
  3. WITH count(doc) as docCount
  4. MATCH (doc:Captions)-[:HAS_CATEGORY]-(c:Categories {id: 'ne0MtinOO6DXryRvqMxS'})
  5. MATCH (doc:Captions)-[:HAS_PILLAR]-(p:Pillars {name: 'Feel Good'})
  6. WITH docCount, doc Limit 12
  7. RETURN doc, docCount

字符串
这将返回一个25的docCountdoc s,限制为12。但感觉就像我做了两次同样的调用。
我不想打两次同样的电话

9jyewag0

9jyewag01#

我找到了答案here
我把它更新成这样

  1. MATCH (doc:Captions)
  2. MATCH (p:Pillars {name: 'Feel Good'})
  3. MATCH (doc)-[:HAS_PILLAR]-(p)
  4. MATCH (c:Categories {id: 'ne0MtinOO6DXryRvqMxS'})
  5. MATCH (doc)-[:HAS_CATEGORY]-(c)
  6. WITH count(*) as docCount, collect(doc) as parts
  7. UNWIND parts as a
  8. RETURN docCount,a
  9. limit 12

字符串
我已经更新了基于@cyberSam的评论

  1. const hasPillar = pageOptionsDto.pillar
  2. ? `(p:Pillars {id: '${pageOptionsDto.pillar}'})<-[:HAS_PILLAR]-`
  3. : '';
  4. const hasCat = pageOptionsDto.category
  5. ? `-[:HAS_CATEGORY]->(c:Categories {id:'${pageOptionsDto.category}'})`
  6. : '';
  7. const hasOrderBy = pageOptionsDto.orderBy
  8. ? `ORDER BY doc.${pageOptionsDto.order}, r.date`
  9. : 'ORDER BY r.date';
  10. const res = await this.neo4jService.read(`
  11. MATCH ${hasPillar}(doc:${collection} {active: true})${hasCat}
  12. WITH count(*) as docCount, collect(doc) as docs
  13. UNWIND docs as doc
  14. OPTIONAL MATCH (u:Users {id: '${activeUserData.sub}'})<-[r:USED_BY]-(doc)
  15. OPTIONAL MATCH (c:Categories)<-[cr:HAS_CATEGORY]-(doc)
  16. OPTIONAL MATCH (doc)-[:HAS_PILLAR]->(p:Pillars)
  17. WITH docCount, doc, r, cr, c, p
  18. ${hasOrderBy}
  19. RETURN docCount, doc, COLLECT(r) as rs, COLLECT(c) as crs, COLLECT(p) as prs
  20. SKIP ${pageOptionsDto.skip} LIMIT ${pageOptionsDto.limit}
  21. `);
  22. return res;

展开查看全部
cuxqih21

cuxqih212#

一个简单的答案是遍历图一次并收集节点:

  1. MATCH (doc:Captions)-[:HAS_CATEGORY]-(:Categories {id: 'ne0MtinOO6DXryRvqMxS'})
  2. MATCH (doc:Captions)-[:HAS_PILLAR]-(p:Pillars {name: 'Feel Good'})
  3. with collect(doc) as Docs
  4. with [i in range(0,12) | Docs[i] ] as MyDocs, size(Docs) as docCount
  5. unwind MyDocs as Doc
  6. return Doc, docCount

字符串
这将返回12行。每行是一个节点和文档的数量。
你上面的评论说文档可以有一个支柱或一个类别。这个查询只会找到两者都有的文档。
为了避免这种情况,从第一个match语句收集文档,从第二个match语句收集文档,然后在处理之前联接列表。
另一个选项是首先匹配文档,然后optional match两个可能的路径。

相关问题