Как я могу избежать посещения узла с одним и тем же свойством более одного раза в neo4j?

Мой запрос Cypher:

MATCH p =(o:Order)-[r:seeks*2..8]->(o:Order)
WHERE o.Name="000093" AND ALL(x IN tail(nodes(p)) WHERE SINGLE(y IN    tail(nodes(p)) WHERE x=y))
RETURN extract(n IN nodes(p)| n.Name) AS OrderID, extract(u IN nodes(p)| u.UserName) AS UserName,length(p), endNode(r[0])
ORDER BY length(p)

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

["000093","000090","000096","000097","000107","000091","000089","000093"]
["yunis","gio","Anhar","Jhon","**shakilbit**","xalima","**shakilbit**","yunis"]

Итак, заказы 0000107 и 000089 размещаются под одним и тем же именем пользователя shakilbit. Можно ли как-нибудь избежать того, чтобы такие заказы были на одном пути, Спасибо! NEO4J.. Очень помогающее сообщество, насколько я могу судить.

1 ответ

Решение

С помощью процедур APOC вы можете получить свою коллекцию в виде набора (в котором исключены повторяющиеся значения) и сравнить размеры. Если дубликаты присутствуют, размер набора будет меньше.

MATCH p =(o:Order)-[r:seeks*2..8]->(o:Order)
WHERE o.Name="000093" AND ALL(x IN tail(nodes(p)) WHERE SINGLE(y IN    tail(nodes(p)) WHERE x=y))
WITH p, o, r, extract(u IN nodes(p)| u.UserName) AS UserName
// need to make some adjustments since first and last nodes are same
WHERE size(UserName) - 1 = size(apoc.coll.toSet(tail(UserName)))
RETURN extract(n IN nodes(p)| n.Name) AS OrderID, UserName, length(p), endNode(r[0])
ORDER BY length(p)

Альтернативой является повторение вашего ALL(x in tail...) WHERE single()... предикат, но в коллекции UserName (или включите эту проверку в существующий предикат ALL(), хотя это может быть дорого). Вы можете хотеть ПРОФИЛЬ каждого и посмотреть, что является более производительным.

Другие вопросы по тегам