Как оптимизировать запрос шифров с помощью необязательного предложения соответствия в большой базе данных графа?

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

MATCH ()-[R0:relationshipclazz0]-()
OPTIONAL MATCH ()-[R0:relationshipclazz0]->(N0:entityclazz0)
WITH distinct R0, R0.att0 as AR0att0, N0
WITH ID(R0) as i,   R0.att0 as O1,  (N0.att0) as O2, R0
RETURN  O1, O2, count(i)
ORDER BY  O1, O2

этот запрос занимает 381 секунду в графовой базе данных с 50 000 связей и 6000 узлов

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

заранее спасибо

0

Решение

Большая проблема с такого рода запросами, поиск по отношениям вместо использования начальных узлов или меток узлов, заключается в том, что на данный момент в Neo4j нет эффективного средства поиска отношений по типу. В настоящее время ваш запрос должен просмотреть все узлы в базе данных и проверить все их отношения, чтобы найти те, которые имеют правильный тип.

Ты можешь использовать Процедуры APOC (используйте правильную версию APOC, основанную на вашей версии Neo4j), чтобы добавить ручные указатели на ваших отношениях. Это требует некоторого ненулевого свойства для всех ваших отношений, чтобы поиск индекса работал (вероятно, мы можем использовать att0при условии, что он присутствует во всех ваших отношениях: relationsclazz0).

Сначала нам нужно вручную добавить все эти отношения в ваш индекс:

MATCH ()-[r:relationshipclazz0]-()
CALL apoc.index.addRelationship(r,['att0'])
RETURN count(*)

Теперь мы можем запросить из индекса:

CALL apoc.index.relationships('relationshipclazz0','att0:*') YIELD rel as R0
OPTIONAL MATCH ()-[R0]->(N0:entityclazz0)
WITH R0, R0.att0 as O1,  N0.att0 as O2
RETURN  O1, O2, count(R0)
ORDER BY  O1, O2
0

Другие решения

Других решений пока нет …