如何使用 Cypher neo4j 将三列连接为一列并获取其中唯一条目的计数?

Posted

技术标签:

【中文标题】如何使用 Cypher neo4j 将三列连接为一列并获取其中唯一条目的计数?【英文标题】:How to concatenate three columns into one and obtain count of unique entries among them using Cypher neo4j? 【发布时间】:2017-09-18 16:38:00 【问题描述】:

我可以在 Neo4j 中使用 Cypher 从 Panama 数据库中查询三种身份持有者(我定义该术语)的国家,即实体(公司)、官员(股东)和中介(中间公司)作为三个属性/列。每列有一个或两个用冒号分隔的条目(例如:英属维尔京群岛;俄罗斯)。我们希望将这些列中的国家连接成一组唯一的国家,从而获得国家数量的计数作为新属性。

为此,我根据对 Cypher 的理解尝试了以下代码:

MATCH (BEZ2:Officer)-[:SHAREHOLDER_OF]->(BEZ1:Entity),(BEZ3:Intermediary)-[:INTERMEDIARY_OF]->(BEZ1:Entity)
WHERE BEZ1.address CONTAINS "Belize" AND 
  NOT ((BEZ1.countries="Belize" AND  BEZ2.countries="Belize" AND BEZ3.countries="Belize") OR
    (BEZ1.status IN ["Inactivated", "Dissolved shelf company", "Dissolved", "Discontinued", "Struck / Defunct / Deregistered", "Dead"]))
SET BEZ4.countries= (BEZ1.countries+","+BEZ2.countries+","+BEZ3.countries) 
RETURN BEZ3.countries AS IntermediaryCountries, BEZ3.name AS 
  Intermediaryname, BEZ2.countries AS OfficerCountries , BEZ2.name AS 
  Officername, BEZ1.countries as EntityCountries, BEZ1.name AS Companyname, 
  BEZ1.address AS CompanyAddress,DISTINCT count(BEZ4.countries) AS NoofConnections  

相关部分是第 7 行的 SET 语句和最后一行的 DISTINCT 计数。代码显示对我没有意义的错误:无效的输入'u':预期的'n/N'。我想这可能意味着使用 COLLECT,但我们也尝试过,它显示错误在 'u' 和 'n' 之间反之亦然。请帮助我们获得我们想要的输出,它使我们的工作变得非常容易。提前致谢!

编辑:考虑到我没有按照@Cyber​​sam 的建议定义变量,我尝试了以下命令 CREATE,但它显示命令 RETURN 的错误“无效输入'R':”。这对我来说是深不可测的。非常需要帮助,谢谢。

代码 2:

MATCH (BEZ2:Officer)-[:SHAREHOLDER_OF]->(BEZ1:Entity),(BEZ3:Intermediary)-
[:INTERMEDIARY_OF]->(BEZ1:Entity)
WHERE BEZ1.address CONTAINS "Belize" AND 
NOT ((BEZ1.countries="Belize" AND  BEZ2.countries="Belize" AND 
BEZ3.countries="Belize") OR
(BEZ1.status IN ["Inactivated", "Dissolved shelf company", "Dissolved", 
"Discontinued", "Struck / Defunct / Deregistered", "Dead"]))
CREATE (p:Connectionscountries: 
split((BEZ1.countries+";"+BEZ2.countries+";"+BEZ3.countries),";")
RETURN BEZ3.countries AS IntermediaryCountries, BEZ3.name AS 
Intermediaryname, BEZ2.countries AS OfficerCountries , BEZ2.name AS 
Officername, BEZ1.countries as EntityCountries, BEZ1.name AS Companyname, 
BEZ1.address AS CompanyAddress,  AS TOTAL, collect (DISTINCT 
COUNT(p.countries)) AS NumberofConnections

第 8 行和第 9 行是新的,需要检查。

【问题讨论】:

【参考方案1】:

第一次查询

您从未定义标识符BEZ4,因此您无法在其上设置属性。

第二个查询(应该在一个单独的问题中发布):

您有几个拼写错误和语法错误。

此查询不应出错(但您必须确定它是否符合您的要求):

MATCH (BEZ2:Officer)-[:SHAREHOLDER_OF]->(BEZ1:Entity),(BEZ3:Intermediary)- [:INTERMEDIARY_OF]->(BEZ1:Entity)
WHERE BEZ1.address CONTAINS "Belize" AND  NOT ((BEZ1.countries="Belize" AND  BEZ2.countries="Belize" AND  BEZ3.countries="Belize") OR (BEZ1.status IN ["Inactivated", "Dissolved shelf company", "Dissolved",  "Discontinued", "Struck / Defunct / Deregistered", "Dead"]))
CREATE (p:Connections countries: split((BEZ1.countries+";"+BEZ2.countries+";"+BEZ3.countries), ";"))
RETURN BEZ3.countries AS IntermediaryCountries,
  BEZ3.name AS  Intermediaryname,
  BEZ2.countries AS OfficerCountries ,
  BEZ2.name AS  Officername,
  BEZ1.countries as EntityCountries,
  BEZ1.name AS Companyname,
  BEZ1.address AS CompanyAddress,
  SIZE(p.countries) AS NumberofConnections;

原作的问题:

CREATE 子句缺少结束 和结束 )RETURN 子句有一个悬空的 AS TOTAL 术语。 collect (DISTINCT COUNT(p.countries)) 正在尝试执行不支持的嵌套聚合。无论如何,即使它起作用了,它也可能不会返回你想要的东西。我怀疑您实际上想要 p.countries 集合的大小,所以这就是我在查询中使用的。

【讨论】:

谢谢,我明白了。在尝试了其他选项后,对我来说 EDIT 中的命令似乎合适但仍然给出错误 Invalid input 'R': near RETURN。请帮忙,谢谢! 查看我的更新答案。 你真的应该为新问题创建一个新问题。 大声笑,对愚蠢的错误感到抱歉。我会更加谨慎。谢谢,我没有弄清楚一半的“大小”命令解决了我的问题。但正如我在我的问题中提到的,我的目标是获得唯一/不同的大小,并且命令 Distinct 在 SIZE 之前或 CREATE 之后不起作用。你认为不可能在 p.countries 中取消重复字符串值吗? 你好@Cyber​​sam,请帮我找出大小国家的独特数量。 Distinct SIZE(p.countries) A​​S 弹出一个错误,AS 应该是 AND

以上是关于如何使用 Cypher neo4j 将三列连接为一列并获取其中唯一条目的计数?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 Neo4J Cypher 查询?

Neo4j 使用cypher语言进行查询

如何使用 Neo4J 的 Cypher 查询返回关系类型?

如何使用Cypher只在Neo4j中获得朋友的朋友

如何往neo4j中批量插入cypher语句

neo4j cypher:如何更改关系类型