Neo4j Исключение узлов из результата - PullRequest
0 голосов
/ 25 июня 2018

Я довольно новичок в Neo4j и Graph.

У меня есть простая база данных Graph только с одним отношением: таблица - [содержит] -> столбец

Я пытаюсь получитьсписок таблиц и столбцов, в названии которых содержится определенный термин.

Я хочу показать это в виде списка таблиц и количества столбцов для этой таблицы.Если имя таблицы не содержит термин, а содержит один из столбцов, оно должно быть в списке.Кроме того, в число столбцов должны входить только столбцы, содержащие термин.

Вот пример:

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

Если я ищу термин «чи», желаемый результат будет:

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 голосов
/ 25 июня 2018

Поскольку в вашем подходе в любом случае не будет использоваться поиск по индексу, мы могли бы также изменить подход здесь.

Мы можем начать с сопоставления со всеми: узлами таблицы, а затем ДОПОЛНИТЕЛЬНЫМ МАТЧОМ со всеми:узлы столбцов с вашим предикатом CONTAINS.Когда мы count() совпадений, это будет включать только количество столбцов, где проверка CONTAINS является истинной (в некоторых случаях это будет 0).Так что наш Column_Count будет правильным.

Далее мы отфильтруем результаты, оставив только те строки, в которых мы нашли положительное значение Column_Count или где проверка CONTAINS верна для узла: table.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...