我对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:很高兴就如何改善当前查询提出任何建议。例如,我确定应该两次改善搜索字词。
答案 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