2015-02-27 5 views
2

Это в продолжении Neo4j: Listing node labelsNeo4j: Условный возврат/IF манипуляция пункта/String

Я Построив динамический оператор MATCH вернуть иерархическую структуру & использовать вывод как вход Neo4j JDBC для запроса данных из метод Java:

match p=(:Service)<-[*]-(:Anomaly) 
    with head(nodes(p)) as Service, p, count(p) as cnt 
    return DISTINCT Service.company_id, Service.company_site_id, 
    "MATCH srvhier=(" + 
    reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] + 
    "<-[:BELONGS_TO]-") + ") WHERE Service.company_id = {1} and 
    Service.company_site_id = {2} and Anomaly.name={3} RETURN " + 
    reduce(labels = "", n IN nodes(p) | labels + labels(n)[0] + ".name,"); 

выход следующим образом:

MATCH srvhier=(Service<-[:BELONGS_TO]-Category<-[:BELONGS_TO]-SubService<- 
[:BELONGS_TO]-Assets<-[:BELONGS_TO]-Anomaly<-[:BELONGS_TO]-) WHERE 
Service.company_id = {1} and Service.company_site_id = {21} and 
Anomaly.name={3} RETURN Service.name, Category.name, SubService.name, 
Assets.name, Anomaly.name, 

проблема я вижу:

"BELONGS_TO" добавляемый к моему последнему узлу

Line 2: Активы < - [: BELONGS_TO] -Anomaly ** < - [: BELONGS_TO] - **

Существуют строковые функции (Я посмотрел на Substring ..), который можно использовать для его удаления? Или я могу использовать оператор CASE с условием n = cnt для добавления «BELONGS_TO»?

Та же проблема сохраняется с моей последней строке:

Линия 5: Assets.name, Anomaly.name **, ** - дополнительный "" что мне нужно устранить.

Спасибо.

ответ

1

Я думаю, вам нужно ввести инструкцию case в предложение reduce, как показано ниже. Если узел не является последним элементом коллекции, добавьте связь "<-[:BELONGS_TO]-". Если это последний элемент, не добавляйте его.

... 
reduce(labels = "", n IN nodes(p) | 
case 
    when n <> nodes(p)[length(nodes(p))-1] then 
    labels + labels(n)[0] + "<-[:BELONGS_TO]-" 
    else 
    labels + labels(n)[0] 
    end 
... 
1

Cypher имеет substring функцию, которая работает basically like you'd expect. Пример: вот как вы бы вернуть все, кроме трех последних символов строки:

return substring("hello", 0, length("hello")-3); 

(Это возвращает «он»)

Таким образом, вы можете использовать substring обрезать последний разделитель с вашим запрос, который вы не хотите.

Но я не понимаю, почему вы строите свой запрос таким сложным образом; вы используете cypher для записи cypher (это нормально), но (и я не понимаю вашу модель данных на 100%) мне кажется, что, возможно, есть более простой способ написать этот запрос.

+0

У меня есть иерархия нескольких организаций. Связь не фиксирована .. значение - если 1 организация имеет (a) -> (b) -> (c), то другая может быть (a) -> (c). Итак, первое, что я делаю, это сбор информации о иерархии. На основе иерархии я пытаюсь получить детали (с точки зрения атрибутов/свойств, которые еще не исправлены). Если есть более простой способ сделать это, он будет более чем счастлив использовать его. Как вы думаете, я должен использовать небольшую БД для хранения метаданных иерархии и тем самым избегать первого совпадения. – kkulkarn