【问题标题】:Neo4J Cypher - Case Insensitive MERGENeo4J Cypher - 不区分大小写的 MERGE
【发布时间】:2014-07-04 12:53:35
【问题描述】:

有没有办法在 Cypher (Neo4J) 中进行不区分大小写的 MERGE?

我正在创建一个我能够从一组文档中提取的实体图,并希望合并多个文档中相同的实体(接受相同名称并不意味着相同的风险)实体!)。问题是不同文件的情况可能不同。

目前,我使用 MERGE 语法来创建合并节点,但它对大小写的差异很敏感。如何执行不区分大小写的合并?

【问题讨论】:

  • 嘿,您找到解决方案了吗?您有机会尝试以下建议的解决方案吗?
  • 最后,没有一个提议的解决方案符合我们的要求,因此我们更改了我们的架构以包含一个标记节点,该节点包含我们可以合并的大写值,同时仍保留案例信息原始模式。例如。 (OriginalCase)-[大写]->(ORIGINALCASE)
  • 您可以将其发布为答案并将您的问题标记为已解决。这样它对其他人也有帮助..

标签: neo4j cypher case-insensitive


【解决方案1】:

没有直接的方法,但您可以尝试以下类似的方法。MERGE 用于模式匹配,不同情况的标签构成不同的模式

MERGE (a:Crew123)
WITH a,labels(a) AS t
LIMIT 1
MATCH (n)
WHERE [l IN labels(n) 
  WHERE lower(l)=lower(t[0])] AND a <> n
WITH a,collect(n) AS s
FOREACH (x IN s | 
         DELETE a)
RETURN *

上述查询将为您提供ERROR,但如果存在类似标签,它将删除新创建的节点。您可以在 MERGE 子句中添加其他模式。如果没有类似的标签,它会成功运行。

同样,这只是一种解决方法,不允许新的类似标签。

【讨论】:

    【解决方案2】:

    如果数据来自例如 CSV 或类似来源(参数),您可以使用专用的、一致的 case 属性进行合并并单独设置原始值。

    例如

    CREATE CONSTRAINT ON (u:User) ASSERT u.iname IS UNIQUE;
    
    LOAD CSV WITH HEADERS FROM "http://some/url" AS line
    WITH line, lower(line.name) as iname
    MERGE (u:User {iname:iname}) ON CREATE SET u.name = line.name;
    

    【讨论】:

      【解决方案3】:

      我们找到的最佳解决方案是更改我们的架构以包含一个标记节点,该节点包含我们可以合并的大写值,同时仍保留原始模式的案例信息。例如。 (OriginalCase)-[大写]->(ORIGINALCASE)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        • 2013-03-06
        • 2020-02-18
        • 1970-01-01
        • 2015-02-19
        相关资源
        最近更新 更多