Neo4j: обеспечить уникальность узла, сопоставление один к одному - PullRequest
0 голосов
/ 17 февраля 2019

По сравнению с тем, что я делаю ниже, существует ли более оптимальный способ обеспечения взаимно-однозначного отношения между узлами в графе запросов и полученными совпадениями?

ДляНапример, предположим, я хочу найти пути длиной 4, состоящие из уникальных узлов.У меня может быть такой запрос:

MATCH (n2)--(n1)--(n0)--(n3)--(n4)
return n0,n1,n2,n3,n4

Однако это не гарантирует, что совпадающие узлы различны.Например, n2 и n4 разрешено совпадать (что даст мне цикл).Я могу добавить предложение where "where not (n2 = n4)", но другие узлы тоже могут совпадать.Похоже, мне нужно будет добавить это предложение для всех пар узлов, которые я хочу быть уникальными, что раздражает на больших подграфах.

Есть ли лучший способ обеспечить отношение один к одному?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

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

Например:

MATCH (n)
CALL apoc.path.expandConfig(n, {minLevel:4, maxLevel:4, uniqueness:'NODE_PATH'}) YIELD path
WITH nodes(path) as nodes
RETURN nodes[0] as n1, nodes[1] as n2, nodes[2] as n3, nodes[3] as n4, nodes[4] as n5

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

0 голосов
/ 17 февраля 2019

Используйте переменную пути и проверьте уникальность узлов в пути:

MATCH p = (n1)--(n2)--(n3)--(n4)--(n5)
      // Enumerate all nodes in the path
WHERE ALL(n1 IN nodes(p) WHERE
        // Each node must occur only once
        size([n2 IN nodes(p) WHERE n1 = n2]) = 1
      )
return n1, n2, n3, n4, n5

Или вы можете использовать функцию для проверки на наличие дубликатов в списке из APOC library:

MATCH p = (n1)--(n2)--(n3)--(n4)--(n5)
WHERE apoc.coll.containsDuplicates(nodes(p)) = FALSE
return n1, n2, n3, n4, n5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...