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

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

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

MATCH (doc:Captions)-[:HAS_CATEGORY]-(c:Categories {id: 'ne0MtinOO6DXryRvqMxS'})
MATCH (doc:Captions)-[:HAS_PILLAR]-(p:Pillars {name: 'Feel Good'})
WITH count(doc) as docCount
MATCH (doc:Captions)-[:HAS_CATEGORY]-(c:Categories {id: 'ne0MtinOO6DXryRvqMxS'})
MATCH (doc:Captions)-[:HAS_PILLAR]-(p:Pillars {name: 'Feel Good'})
WITH docCount, doc Limit 12
RETURN doc, docCount

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

9jyewag0

9jyewag01#

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

MATCH (doc:Captions)
MATCH (p:Pillars {name: 'Feel Good'})
MATCH (doc)-[:HAS_PILLAR]-(p)
MATCH (c:Categories {id: 'ne0MtinOO6DXryRvqMxS'})
MATCH (doc)-[:HAS_CATEGORY]-(c)
WITH count(*) as docCount, collect(doc) as parts
UNWIND parts as a
RETURN docCount,a 
limit 12

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

const hasPillar = pageOptionsDto.pillar
  ? `(p:Pillars {id: '${pageOptionsDto.pillar}'})<-[:HAS_PILLAR]-`
  : '';
const hasCat = pageOptionsDto.category
  ? `-[:HAS_CATEGORY]->(c:Categories {id:'${pageOptionsDto.category}'})`
  : '';
const hasOrderBy = pageOptionsDto.orderBy
  ? `ORDER BY doc.${pageOptionsDto.order}, r.date`
  : 'ORDER BY r.date';
const res = await this.neo4jService.read(`
  MATCH ${hasPillar}(doc:${collection} {active: true})${hasCat}
  WITH count(*) as docCount, collect(doc) as docs
  UNWIND docs as doc
  OPTIONAL MATCH (u:Users {id: '${activeUserData.sub}'})<-[r:USED_BY]-(doc)
  OPTIONAL MATCH (c:Categories)<-[cr:HAS_CATEGORY]-(doc)
  OPTIONAL MATCH (doc)-[:HAS_PILLAR]->(p:Pillars)
  WITH docCount, doc, r, cr, c, p
  ${hasOrderBy}
  RETURN docCount, doc, COLLECT(r) as rs, COLLECT(c) as crs, COLLECT(p) as prs
  SKIP ${pageOptionsDto.skip} LIMIT ${pageOptionsDto.limit}
`);

return res;

cuxqih21

cuxqih212#

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

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

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

相关问题