2017-02-05 12 views
0

Чтобы лучше понять, как результаты отформатированы в нео:Простой запрос в Neo4j - нет записи, если узел имеет степень 0

Простой запрос, где узел ENSG00000180447 не имеет соседа:

MATCH (d:Target)-[r:Interaction]-(t:Target) 
     where d.uid = 'ENSG00000180447' 
     with d, count(t) as degree 
     Return d, degree 

(no changes, no records) 

Вместо

MATCH (d:Target) 
     where d.uid = 'ENSG00000180447' 
     Return d # return the node 

MATCH (d:Target)-[r:Interaction]-(t:Target) 
     where d.uid = 'ENSG00000180447' 
     with count(t) as degree 
     Return degree # return 0 

Я хотел бы получить возвращенный узел и его степень по одному и тому же запросу. В чем проблема с первым запросом?

+0

Просто объедините два ответа. Если вам нужны как степень, так и дополнительные конечные узлы. –

ответ

0

Проблема, как stdob-- указывает, что при выполнении MATCH, он возвращает строки, для которых совпадение истинно. Таким образом, вы запрашиваете совпадение между этим конкретным узлом: Целевым узлом с использованием отношения типа: Взаимодействие. Поскольку такой шаблон не существует, строки не возвращаются.

Функция SIZE(), вероятно, будет лучшим выбором для краткого запроса, вы можете использовать ее для поиска вхождения шаблона. В этом случае мы можем использовать его, чтобы найти количество отношений этого типа к: Целевой узел:

MATCH (d:Target) 
WHERE d.uid = 'ENSG00000180447'  
RETURN d, SIZE((d)-[:Interaction]-(:Target)) AS degree 

EDIT - объяснить, почему ваш запрос возврата узла и не считать возвращает ни одной строки.

COUNT() - это агрегация, которая имеет только контекст из столбцов без агрегации (ключ группировки). По своей собственной, COUNT() не имеет никакого другого контекста и никаких ключей группировки, и он может обрабатывать пустые значения:

COUNT(null) = 0.

Когда мы выполняем спички, мы строим ряды. Если MATCH не находит никаких совпадений, ни одной строки не возвращается:

MATCH (ele:PinkElephant) 
RETURN ele 
// (no changes, no records) 

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

MATCH (person:Person)-[:Halucinates]->(ele:PinkElephant) 
RETURN ele, COUNT(person) 
// (no changes, no records) 

в этом случае, вы просящая строки: PinkElephant узлов, и для каждого из этих узлов, подсчет людей, которые галлюцинация, что розовый слон.

Но их нет: PinkElephant nodes. Для работы COUNT() нет строк. Мы не можем отображать строки, потому что для их заполнения нет узлов.

Даже если на графике были узлы PinkElephant, если бы не было связей с: узлами пользователей, результат был бы таким же. Матч ничего не нашел, потому что шаблон, который вы просили (розовые слоны, галлюцинированные людьми), не существует.Нет: PinkElephants, которые галлюцинированы: Person, поэтому нет узлов для заполнения столбца ele, поэтому нет строк, и если строк нет, то ваш COUNT() не сможет выполнить, и нет места для добавления возврата стоимость.

+0

Факт: существует ли связь между двумя узлами. См. Мой второй запрос в вопросе: если я попрошу вернуть только степень, нуль будет правильно найден. Я не undersand, почему null возвращается при запросе обоих узлов «d» и t степени, которая равна нулю. Может быть, мне непонятно, что такое «шаблон» в этом случае? – user305883

1

«MATCH» ищет точное соответствие по образцу и не находит его для узла с uid = 'ENSG00000180447'. Есть два способа:

1) Используйте OPTIONAL MATCH:

MATCH (d:Target) 
     WHERE d.uid = 'ENSG00000180447'  
OPTIONAL MATCH (d)-[r:Interaction]-(t:Target) 
RETURN d, COUNT(t) AS degree 

2) Используйте ноль length paths:

MATCH (d:Target)-[r:Interaction*0..1]-(t:Target) 
     where d.uid = 'ENSG00000180447' 
     with d, count(t) as degree 
     Return d, degree-1 
+0

Хорошо, но не могли бы вы объяснить, что такое «шаблон», соответствующий каждому из трех запросов? Кроме того, почему степень минус 1? – user305883