Neo4j从结果中排除节点

时间:2018-06-25 04:39:00

标签: neo4j cypher

我对Neo4j和Graph很陌生。

我有一个只有一个关系的简单Graph数据库:table-[contains]-> column

我正在尝试获取名称中包含特定术语的表和列的列表。

我想将其显示为表列表和该表的列数。如果表名不包含该术语,但其中一个列包含该术语,则它应该在列表中。另外,列数应仅包括包含该术语的列。

这里是一个例子:

Table: "Chicago", Columns: "Chi_Address", "Chi_Weather", "Latitude"
Table: "Miami"  , Columns: "Mia_to_Chi", "Mia_Weather"
Table: "Dallas" , Columns: "Dal_to_Mia", "Dal_Weather"

如果我搜索“ chi”一词,则期望的结果将是:

Table   -- Col Count
Chicago -- 2
Miami   -- 1

这是我当前的查询:

MATCH (t:table)-[r:contains]->(c:column) 
where toLower(t.name) contains toLower('CHI') or toLower(c.name) contains toLower('CHI')
return t.name as Table_Name,count(c.name) as Column_Count

我的问题是,如果一个表包含该术语,那么我将获得其所有列的计数,而不仅仅是包含该术语的列。所以我是我的榜样

Chicago -- 3 //Instead of 2
Miami   -- 1

我正在考虑做类似的事情:

count(c.name WHERE c.name contains('CHI')

但这似乎不是有效的语法。

任何帮助将不胜感激。

PS:很高兴就如何改善当前查询提出任何建议。例如,我确定应该两次改善搜索字词。

1 个答案:

答案 0 :(得分:0)

由于您的方法无论如何都不会使用索引查找,因此我们最好在这里更改此方法。

我们可以首先匹配所有:table节点,然后使用CONTAINS谓词匹配所有:column节点。当我们count()进行匹配时,这将仅包含CONTAINS检查为true(在某些情况下为0)的列数。这样我们的Column_Count就正确了。

接下来,我们将过滤结果,只保留发现Column_Count为正数或:table节点的CONTAINS检查为true的行。

MATCH (t:table)
OPTIONAL MATCH (t)-[:contains]->(c:column)
WHERE toLower(c.name) contains toLower('CHI')
WITH t, count(c) as Column_Count
WHERE Column_Count <> 0 OR toLower(t.name) contains toLower('CHI')
RETURN t.name as Table_Name, Column_Count