【问题标题】:COLLECT() causes function to enter infinite loading loopCOLLECT() 导致函数进入无限加载循环
【发布时间】:2021-06-30 10:07:30
【问题描述】:

在 Neo4j 中,我有一组图表,包括种子术语和通过关系 [:SYNONYM_OF] 附加到这些种子术语的同义词。我正在编写一个函数,其中包含与某个种子词的同义词匹配的单词的任何节点都会与列出的任何相关同义词一起返回。我当前的查询如下所示:

MATCH (b)-[*]->(z)-[*]->(n),
      (syn)<-[r]->(seed:Seed_Term {name: "valuation"})
WHERE (
  (
    n.name CONTAINS toLower(syn.name)
    OR n.content CONTAINS toLower(syn.name)
  )
  OR (
    n.name CONTAINS toUpper(syn.name)
    OR n.content CONTAINS toUpper(syn.name)
  )
)
AND (b:Label)
AND (n:Title OR n:Text OR n:Column OR n:RowName OR n:Cell)
AND (z:Pdf)
RETURN n.name AS node,
       syn.name AS synonym_found,
       seed.name AS seed_term,
       b.labelName AS company,
       z.year AS year,
       r AS rel_type
LIMIT 1000

唯一的问题是如果找到三个不同的同义词,它会返回包含内容(节点)的行三次,每次 synonym_found 都不同。我知道我应该改用collect(syn.name) 而不是syn.name,但是每当我这样做时,代码都会进入一个无限循环,以至于我只需要终止查询。即使我最后写了LIMIT 1,也会发生这种情况。为什么collect() 会导致这种情况发生?

【问题讨论】:

    标签: neo4j cypher collect


    【解决方案1】:

    您的MATCH 是与(未定义的)可变长度路径相结合的笛卡尔积。 这是一个非常密集的查询。

    我会将查询拆分为 (1) 匹配同义词,然后 (2) 获取节点的附加信息:

    MATCH (seed:Seed_Term {name: "valuation"})-[r]-(syn), (n)
    WHERE (n:Title OR n:Text OR n:Column OR n:RowName OR n:Cell)
    AND (
      n.name =~ "(?i).*" + syn.name + ".*" // case insensitive regular expression
      OR n.content =~ "(?i).*" + syn.name + ".*"
    )
    WITH seed, n, r, collect(syn.name) AS synonyms
    MATCH (n)<-[*]-(z:Pdf)<-[*]-(b:Label)
    RETURN n.name AS node,
           synonyms,
           seed.name AS seed_term,
           b.labelName AS company,
           z.year AS year,
           type(r) AS rel_type
    LIMIT 1000
    

    我没有测试过这个查询,但它可能会引导你走向正确的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2012-07-04
      • 2021-12-10
      相关资源
      最近更新 更多