查询graphDB(密码)

时间:2017-11-03 19:07:45

标签: neo4j cypher

我试图解释它们之间的节点和关系:

  1. (CR)-[:HAS]->(SR)
  2. (CR)-[:TAGGED_TO]->(KEYWORDS)
  3. (SR)-[:TAGGED_TO]->(KEYWORDS)
  4. 所以,我有3种类型的节点(CRSRKEYWORDS)和2种关系(HASTAGGED_TO)。

    一个CR附加了许多SR,一个CR可以标记为多个KEYWORDS,还有一个SR可以标记为多个KEYWORDS KEYWORDS {1}},CRSR中可能会有一个或多个CR

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

    • 第一栏:匹配KEYWORDS的{​​{1}}人。
    • 第二栏:第1栏中列出的SR附加CR的数量。
    • 第3列:与第1列中出现的KEYWORDS匹配的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
    

    输出控制台的图像

    enter image description here

    在我的输出控制台中,我有3列

    1. CR_number
    2. no_of_keywords_matched_to_that_CR
    3. Number_of_SR_attached_to_that_CR。
    4. 在第4列中,我希望在给定关键字中匹配的关键字数量与第3列中的SR相匹配。

      例如,CR 1-11071804441在4个给定关键字中匹配了2个关键字,并附加了893个SR。

      我想要第4列,其中包含4个关键字中的关键字数量,这些关键字与第3列中的893 SR匹配。

      对于一个实例,假设在893 SR中SR 1st SR包含4个给定关键字中的2个关键字,而第2个SR包含相同的2个关键字,其中包含第1个SR(因此我们不会计算这2个关键字)和新的关键字给定的4个关键字,所以我的总计数将变为3,我们必须计算所有893 SR的关键字,这些关键字在第1列中附加到CR 1-11071804441。就像与SR匹配的关键字总数最多为4,因为我们总共有4个给定的关键字。就像我必须为所有CR_number填充我的第4列

1 个答案:

答案 0 :(得分:0)

试试这个:

... 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,以及附加到这些SR的所有CR

在第二个OPTIONAL MATCH中,查询会匹配以前提取的Tag附加的所有SR。第二个匹配为OPTIONAL的原因是因为可能SR个可能没有附加任何Tag个(正常的MATCH会将您的SR过滤到只返回至少附带标签的那些)。