Вернуть большие подграфы из списка идентификаторов в Cypher (Neo4j) - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть вопрос относительно использования клиента Neo4j для Java. У меня есть график с около 120 000 000 узлов и 1 000 000 000 ребер. Из этого графика я хочу извлечь подграфы (средний размер около 500 узлов). Для этого я создал индекс по полям Id узлов. Запросы выглядят так:

MATCH (a:XXX:YYYY) 
WHERE a.uid IN [9999, 5555, 7777, 99999, ...] 
RETURN a AS blablubb

В данный момент я ищу ребра со вторым запросом, который выглядит следующим образом

MATCH (a::XXX:YYYY)-[r:ZZZZ]-(b::XXX:YYYY)
WHERE a.uid IN [9999, 5555, 7777, 99999, ...]
AND b.uid IN [9999, 5555, 7777, 99999, ...]

Это очень очень медленно, особенно когда подграфы получаются больше. Теперь у меня вопрос: как мне соединить два запроса, чтобы получить одновременно ребра и узлы подграфа? Я знаю, что есть более быстрое решение, потому что браузер Neo4j дает мне визуализацию для

MATCH (a:XXX:YYYY) 
WHERE a.uid IN [9999, 5555, 7777, 99999, ...] 
RETURN a AS blablubb

, которая содержит все ребра.

большое спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Это более простая и эффективная версия вашего собственного ответа:

WITH [9999, 5555, 7777, 99999, ...] AS wanted
MATCH (n:Uid)-[r]->(n2)
WHERE n.uid IN wanted AND n2 IN wanted
RETURN r AS relation

Если вы передадите wanted в качестве параметра , запрос будет:

MATCH (n:Uid)-[r]->(n2)
WHERE n.uid IN $wanted AND n2 IN $wanted
RETURN r AS relation
0 голосов
/ 14 февраля 2020

Я разделил запрос на два разных запроса. Первый извлек узлы

MATCH (a:XXX:YYYY) 
WHERE a.uid IN [9999, 5555, 7777, 99999, ...] 
RETURN a AS node

, а второй

MATCH (n:Uid)
WHERE n.uid IN [9999, 5555, 7777, 99999, ...]
WITH collect(n) AS nds
UNWIND nds AS n1
MATCH (n1)-[r]-(n2)
WHERE n2 IN nds
RETURN r AS relation

по краям. По некоторым причинам, это становится очень медленным, когда я пытаюсь объединить два и получить список ребер и список узлов. Общее решение не очень удовлетворительное, но, по крайней мере, мне удалось сохранить приемлемую производительность.

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