2016-01-05 2 views
2

Я работаю с пользователями, назначенными конкретным такси. Каждый пользователь имеет назначение Grid (выключение), например.cypher из группы узлов, возвращающих узлы на некотором расстоянии

MATCH (g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]->(t:Taxi {name:'Taxi1813'}) 
RETURN g.name as gridName, rp.time as dropTime, u.name as userName 

Это результат

gridName dropTime userName 
    Grid1347 04:44 User183 
    Grid1239 04:38 User177 
    Grid811 04:44 User198 
    Grid765 04:45 User197 
    Grid1184 04:41 User179 
    Grid333 04:45 User186 

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

Для этого мне нужно выяснить, меньше ли времени между каждой сеткой, чем n значение. Отношение каждой сетки равно, например,

(:Grid)-[:TO {time:3}]-(:Grid) 

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

является Grid1347 близко к G1239 ?, является G1347 близко к G811? ... есть G1239 близко к G1347? ... etc..etc

Если я запустил этот запрос, чтобы получить пользователей и сетки в диапазоне [: TO * 1..2], которые назначены конкретным : Такси

MATCH 
    (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]-> 
    (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]-> 
    (t:Taxi {name:'Taxi1813'}) 
RETURN u.name, g.name, u2.name, g2.name 

Я получил эту

u.name g.name  u2.name g2.name 
User183 Grid1347 User177 Grid1239 
User177 Grid1239 User183 Grid1347 
User177 Grid1239 User179 Grid1184 
User177 Grid1239 User179 Grid1184 
User179 Grid1184 User177 Grid1239 
User179 Grid1184 User177 Grid1239 

Но я думаю, не является оптимальным, так как я получил повторенное значение (Сетки и пользователей)

С предыдущего запросом моей первой мыслью была такой запросом, но я Жду» t получить какой-либо результат

MATCH 
    (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]-> 
    (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]-> 
    (t:Taxi {name:'Taxi1813'}) 
WITH g2, g 
MATCH p=shortestPath((g2)-[r:TO]-(g)) 
WITH p, 
REDUCE(totalTime = 0, x IN RELATIONSHIPS(p) | totalTime + x.time) AS totalTime 
RETURN totalTime 

Любые предложения? Спасибо заранее

ответ

1

Чтобы избежать дубликатов как user_a/user_b и user_b/user_a, вы можете добавить WHERE ID(u) < ID(u2), чтобы убедиться, что вы получите только каждую пару раз:

MATCH 
    (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]-> 
    (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]->(t) 
WHERE ID(u) < ID(u2) 
RETURN u.name, g.name, u2.name, g2.name 

В зависимости от вашего домена, его иметь смысл делать это для сеток вместо этого (например, WHERE ID(g) < ID(g2)).

Отдельно я не знаю, если это поможет или нет, но вы можете рассмотреть вопрос о метке, которая является чем-то вдоль линий Reservation или Pickup, которые могут иметь отношения как -[:MADE_BY]->(:User), -[:FULFILLED_BY]->(:Taxi), -[:DROPPED_OF_AT]->(:Grid).

+0

Спасибо @BrianUnderwood, я попробовал ваше предложение. Сначала с идентификатором состояния пользователя (u) andreahg

+0

и да, как только вы предложили мне добавить новые ярлыки, я действительно хотел бы, но проблема в том, что мы собираемся объединить два алгоритма, а другой ученик уже определил метки и разработал один алгоритм. Так что сейчас невозможно внести изменения: (потому что у нас нет времени.Благодарим вас за ваши предложения. Надеюсь, у нас больше не будет проблем с – andreahg

+0

Для чего это стоит, узел может иметь несколько ярлыков. Таким образом, возможно, было бы возможно объединить два алгоритма. – cybersam

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