Как найти отключенные узлы на neo4j с помощью Cypher?

Я играюсь с neo4j и заметил, что всем запросам Cypher нужна отправная точка в предложении START. Мне было интересно, как я могу найти все отключенные узлы с помощью Cypher?

спасибо


person Dan    schedule 29.12.2011    source источник


Ответы (4)


Если все ваши узлы проиндексированы (например, с помощью автоматического индексирования), вы можете использовать индексный запрос в качестве отправной точки, а затем найти те узлы, у которых нет исходящих отношений.

start n=node:node_auto_index("id:*")
match n-[r?]->m
where r is null
return n

В настоящее время я бы предпочел использовать:

start n=node:node_auto_index("id:*")
where not (n-->m)
return n
person Michael Hunger    schedule 29.12.2011
comment
любой способ индексировать задним числом? - person Dan; 30.12.2011
comment
Да, но вам придется создать нужные индексы, затем пройтись по всем узлам и добавить их там, где это необходимо. В собственном Java API вы должны использовать GlobalGraphOperations.getAllNodes() - person akollegger; 04.01.2012
comment
Боюсь, я могу использовать только REST или веб-админку... есть ли надежда? - person Dan; 01.02.2012
comment
Должно быть возможно с помощью консоли Gremlin. Сначала включите автоиндекс, затем выполните скрипт гремлина. У меня нет под рукой синтаксиса, но что-то вроде g.V.each { it, idx -> it.id = idx } должно быть достаточно. - person Michael Hunger; 05.02.2012
comment
Это плохо отвечает на вопрос. Запрос по-прежнему будет соответствовать узлам, которые подключены к графу входящим соединением. - person drzax; 23.09.2013
comment
Если вас не волнует тип узла, направление отношений или куда идут отношения, вы можете использовать небольшую модификацию: START a=node(*) WHERE NOT ((a)--()) RETURN a; - person firefly2442; 10.12.2013

Я использую что-то вроде этого, но только когда использую spring-data-neo4j:

    start n = node:__types__(className="com.app.entity.Model")
    // match, where...
    return n

Надеюсь, это поможет!

person Daniel Rochetti    schedule 09.04.2012

С Neo4j v3.0+ я просто использую;

MATCH (n)
WHERE NOT (n)--()
RETURN n

(или их варианты). Запрос достаточно быстрый.

person danodonovan    schedule 02.07.2018

Вы не можете. Глобальные запросы графа невозможны с сегодняшним Cypher.

person Andres    schedule 29.12.2011
comment
теперь они (Neo4j 1.7) с start n=node(*) match... где... return n - person Michael Hunger; 11.04.2012
comment
за этот ответ в конечном итоге проголосовали, но он был точным на момент публикации, как кажется - person George Birbilis; 07.12.2014