2015-06-24 1 views
2

У меня есть база данных графов, содержащая высокосвязные узлы (концентраторы). Эти узлы могут иметь более 40000 отношений.Запрос Cypher для остановки обхода графика при достижении концентратора

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

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

Я пробовал:

MATCH p=(n)-[r*..10]-(m) 
WHERE n.name='MyNodeName' AND ALL (x IN nodes(p) WHERE count(x) < 10) 
RETURN p; 

, а также:

MATCH (n)-[r*..10]-(m) WHERE n.name='MyNodeName' AND COUNT(r) < 10 RETURN p; 

ответ

2

Я думаю, что вы не можете остановить запрос на какой-то узел, если вы MATCH путь длины 10. Можно подсчитать число отношений для всех узлов в пути, но только после путь согласован.

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

MATCH (a:YourLabel) 
OPTIONAL MATCH (a)-[r]-() 
WITH a, count(r) as count_rels 
CASE 
WHEN count_rels > 20000 
THEN SET a :Hub 
END 

Ваш запрос:

MATCH p=(n)-[r*..10]-(m) 
WHERE n.name='MyNodeName' AND NONE (x IN nodes(p) WHERE x:Hub) 
RETURN p 

Я использовал этот подход в подобном случае.

+0

Спасибо Мартину, я постараюсь это. – SebCarrere

1

С Neo4j 2.2 есть крутой трюк, чтобы использовать внутреннюю функцию getDegree(), чтобы определить, является ли узел плотным узлом.

Вы также забыли метку (и, возможно, индекс) для n

В вашем случае это будет означать:

MATCH p=(n:Label)-[r*..10]-(m) 
WHERE n.name='MyNodeName' AND size((m)--()) < 10 
RETURN p; 
+0

Отлично! Он работает отлично. Спасибо, Майкл! – SebCarrere