2015-02-23 2 views
5

Я использую Neo4j 2.1.7 и Node.js для создания REST API. Данные - около 70 000 узлов и 100 000 отношений - содержат очень много небольших подключенных подграфов.Найти узлы и их связанные подграфы с Neo4j + Cypher

Один вызов API, например localhost:8000/search?name=Bussum, должен возвращать все узлы с именем Bussum и связанный компонент, к которому они принадлежат.

Иллюстрация:

Connected components

(Изображение из Wikipedia)

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

MATCH (a {name: "Bussum" })-[r*]-(b) 
UNWIND rels AS rel 
RETURN distinct startNode(rel) AS a, type(rel), endNode(rel) AS b 

Но такой будет запрос просто верните все троек (a)-[r]-(b) (не сгруппированы по компонентам/подграф). Конечно, я мог бы восстановить граф в Node.js и сам найти подграфы, но это совсем не похоже на лучшее решение. Можно ли группировать возвращаемые данные в массиве/коллекции подграфов/компонентов? Какие запросы Cypher будут лучше соответствовать моему варианту использования? Или я должен вместо этого использовать API-интерфейс Neo4j Java?

Спасибо! Bert

+0

как «маленькие» являются подграфами? Разве те, что изображены на иллюстрации, являются наименьшими по величине? –

+0

Некоторые содержат одну вершину, около 100, но большинство между 5 и 10. – Bert

+0

У узлов в каждом конкретном подграфе есть уникальный идентификатор этого подграфа? –

ответ

3

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

MATCH (root {name: "Bussum" })-[rels*]-(b) 
UNWIND rels AS rel 
RETURN root, 
     collect({start: startNode(rel), 
       type:  type(rel), 
        end: endNode(rel)}) as component 
+0

Группировка с помощью 'root' возвращает одну коллекцию со всеми отношениями из всех путей. Вместо этого, я думаю, что группировка должна выполняться 'rels'. – zaboco

+0

Есть ли название для этой операции? (поиск самого большого подграфа, содержащего определенный узел) –

1
MATCH (a {name: "Bossum"})-[*0..]-(b) 
WITH DISTINCT a, collect(DISTINCT b) AS sets 
RETURN DISTINCT sets 

Этот запрос будет возвращать (возможно) множество строк, где каждая строка представляет собой набор узлов, которые делают полный подграф таким образом, что каждый подграф является столь же большим, как это возможно, и содержит, по меньшей мере, один узел с именем " Bossum». Каждая строка (подграф) гарантированно будет уникальной в наборе результатов.

* Следует отметить, что я не знаю об эффективности этого метода.

Смежные вопросы