Neo4j 查询graphDB(密码)

Neo4j 查询graphDB(密码),neo4j,cypher,Neo4j,Cypher,我试图解释节点及其之间的关系: (CR)-[:HAS]->(SR) (CR)-[:标记到]->(关键字) (SR)-[:标记到]->(关键字) 因此,我有3种类型的节点(CR、SR和关键字)和2种关系(具有和标记到) 一个CR附加了许多SR,一个CR可以标记为多个关键字,一个SR可以标记为多个关键字,一个或多个关键字可以在CR和SR中常见 假设我们有4个给定的关键字,现在我们需要从我的查询中找到4列: 第1列:匹配了关键字的CR 第二列:附在第1列中的CR的SR数量 第三列:和第一列中的CR匹

我试图解释节点及其之间的关系:

  • (CR)-[:HAS]->(SR)
  • (CR)-[:标记到]->(关键字)
  • (SR)-[:标记到]->(关键字)
  • 因此,我有3种类型的节点(
    CR
    SR
    关键字
    )和2种关系(
    具有
    标记到

    一个
    CR
    附加了许多
    SR
    ,一个
    CR
    可以标记为多个
    关键字
    ,一个
    SR
    可以标记为多个
    关键字
    ,一个或多个
    关键字
    可以在
    CR
    SR
    中常见

    假设我们有4个给定的关键字,现在我们需要从我的查询中找到4列:

    • 第1列:匹配了
      关键字的
      CR
    • 第二列:附在第1列中的
      CR
      SR
      数量
    • 第三列:和第一列中的
      CR
      匹配的
      关键字的计数
      
    • 第4列:与第2列中的
      SR
      匹配的唯一关键字数
    我已经编写了一个查询,它能够实现前3列,但不能得到第4列

    WITH ["level","transact","balance","line"] AS coll
    WITH coll, range(0, size(coll)-1) AS is
    UNWIND is AS i
    WITH coll[i] as col, i
    match (s:SR)-[t:TAGGED_TO]->(tg:Tag) where tg.name=~('.*'+col+'.*') 
    with  s, count(t) as no_of_keywords
    matched_in_SR  match (s:SR)<-[h:HAS]-(c:CR) 
    return c.CR_Number,count(h) as NO_of_SR_under_CR_which_contain_keywords, 
    no_of_keywords_matched_in_SR
    
    以[“级别”、“交易”、“余额”、“行”]作为coll
    使用coll时,范围(0,大小(coll)-1)保持不变
    放松和我一样重要
    以coll[i]为col,i
    匹配(s:SR)-[t:taged_TO]->(tg:Tag),其中tg.name=~('.'''.'+col+'.'.'''.'))
    使用s,将(t)算作\u关键字的no\u
    匹配中的匹配(s:SR)尝试以下操作:

    ... WITH col               
    MATCH (s:SR)-[:HAS]-(c:CR)-[:TAGGED_TO]-(tg:Tag) 
    WHERE tg.name=~('.*'+col+'.*') 
    WITH c, tg, s 
    OPTIONAL MATCH (s)-[:TAGGED_TO]-(tg1:Tag)
    WHERE tg1.name=~('.*'+col+'.*')
    RETURN c.CR_Number as CR_number, 
     count(distinct tg) as NO_of_keywords_matched_in_CR, 
     count(distinct s) as NO_of_SR_under_CR_which_contain_keywords, 
     count(distinct tg1) as NO_of_keywords_matched_in_SR
    
    在第一个
    MATCH
    中,查询匹配所有包含所需关键字的
    CR
    s,以及附加到这些
    CR
    s的所有
    SR
    s

    在第二个
    可选匹配
    中,查询匹配所有附加到先前获取的
    SR
    s的
    标记。第二个匹配是可选的,原因是可能有
    SR
    s没有附加任何
    Tag
    s(正常匹配会过滤你的
    SR
    s,只返回至少附加了on Tag的那些)。

    尝试以下操作:

    ... WITH col               
    MATCH (s:SR)-[:HAS]-(c:CR)-[:TAGGED_TO]-(tg:Tag) 
    WHERE tg.name=~('.*'+col+'.*') 
    WITH c, tg, s 
    OPTIONAL MATCH (s)-[:TAGGED_TO]-(tg1:Tag)
    WHERE tg1.name=~('.*'+col+'.*')
    RETURN c.CR_Number as CR_number, 
     count(distinct tg) as NO_of_keywords_matched_in_CR, 
     count(distinct s) as NO_of_SR_under_CR_which_contain_keywords, 
     count(distinct tg1) as NO_of_keywords_matched_in_SR
    
    在第一个
    MATCH
    中,查询匹配所有包含所需关键字的
    CR
    s,以及附加到这些
    CR
    s的所有
    SR
    s


    在第二个
    可选匹配
    中,查询匹配所有附加到先前获取的
    SR
    s的
    标记。第二个匹配是可选的,因为可能有
    SR
    s没有任何
    Tag
    s附加(正常匹配会过滤你的
    SR
    s,只返回至少附加了on Tag的那些)。

    我认为你问题的标题太宽泛了。请编辑它。此外,您能否共享示例数据和预期结果?也许是。谢谢你的建议。@BrunoPeres。我已经添加了更多的信息和输出控制台的图像。我认为你问题的标题太宽泛了。请编辑它。此外,您能否共享示例数据和预期结果?也许是。谢谢你的建议。@BrunoPeres。我已经添加了更多信息和输出控制台的图像。谢谢@imran。实际上,第一列和第四列需要CR_编号:-如果我们看到第二行图像,CR在4个给定关键字中有1个关键字,385 SR在其中。现在在输出的4列中,我想知道这385 SR在4个给定关键字中包含多少个关键字。例如,在这385个关键字中,假设第一个SR包含4个给定关键字中匹配的2个关键字,第二个SR包含相同的2个关键字和1个新关键字,所以,count变为3,我们必须计算385 SR,并将第2行中的CR作为第4列(因此max.count将变为4,因为我们的示例中只有4个给定关键字)@Rajat我已根据您的更新更新了查询。如果它不能按预期工作,请共享一些输入数据集以测试针对Thanks@imran的查询。实际上,第一列和第四列需要CR_编号:-如果我们看到第二行图像,CR在4个给定关键字中有1个关键字,385 SR在其中。现在在输出的4列中,我想知道这385 SR在4个给定关键字中包含多少个关键字。例如,在这385个关键字中,假设第一个SR包含4个给定关键字中匹配的2个关键字,第二个SR包含相同的2个关键字和1个新关键字,所以,count变为3,我们必须计算385 SR,并将第2行中的CR作为第4列(因此max.count将变为4,因为我们的示例中只有4个给定关键字)@Rajat我已根据您的更新更新了查询。如果它不能像预期的那样工作,您可以共享一些输入数据集来测试查询吗