Найти все пути, которые имеют данный узел - PullRequest
1 голос
/ 02 ноября 2010

У меня есть база данных путей и узлов. Путь определяется двумя или более узлами. Список идентификаторов узлов, содержащихся в пути, хранится в таблице way_nodes.

У меня есть таблица соединений узлов, точки, где соединяются два или более способов. Объединение определяется как два или более способов, имеющих один и тот же узел. Я ищу, чтобы найти пути, которые имеют соединения. Итак, попробуем что-то вроде этого:

SELECT DISTINCT 
       way_id 
  FROM way_nodes wn 
  JOIN path_vectors pv ON pv.node_id = wn.node_id

Таблица path_vectors содержит список всех узлов, которые являются соединениями между способами, он предварительно рассчитан.

Я обнаружил, что это было слишком медленно, возможно, 5 путей в секунду, с моей большой базой данных ~ 10000 путей и ~ 40 000 узлов. Это связано с моим предыдущим вопросом .

Цель этой информации - упростить дорожные сети в простой график, который можно использовать с указателем пути для построения оптимального маршрута. Я использую данные Open Street Map, отсюда и похожая терминология.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2010

рассмотрим это ...

select node_id, count(distinct node_id)
from way_nodes 
group by node_id
having count(distinct way_id) > 1

Это даст вам идентификаторы всех nodes, с которыми связано более одного way.

теперь просто объедините его спростой запрос назад в другом направлении, чтобы получить все way_id s:

SELECT way_id
FROM way_nodes JOIN (
    select node_id, count(distinct node_id)
    from way_nodes 
    group by node_id
    having count(distinct way_id) > 1
) as nn ON ( way_nodes.node_id = nn.node_id )
GROUP BY way_nodes.way_id

У меня нет вашей базы данных, поэтому я не могу проверить это ... но что-то подобное должно работать,Если вы не можете заставить это работать, отправьте сообщение обратно, и мы поможем вам разобраться с этим.


[править]

"Таблица path_vectorsсодержит список всех узлов, которые являются соединениями между способами, он предварительно рассчитан. "

, так что ... учитывая, что вы можете просто сделать:

SELECT way_nodes.way_id
FROM 
  way_nodes
  JOIN
  path_vectors
  ON (path_vectors.node_id = way_nodes.node_id)
GROUP BY way_nodes.way_id
0 голосов
/ 03 ноября 2010

Насколько я понимаю, вы пытаетесь построить список всех значений way_id из таблицы way_nodes, где в таблице path_vectors есть соответствующий node_id.

Если все значения node_id хранятся в таблице path_vectors, это можно упростить до:

select distinct way_id from way_nodes

Если не все значения node_id хранятся в таблице path_vectors, этот может быть наиболее эффективным способом запроса значений:

select distinct way_id from way_nodes wn
where exists
(select null from path_vectors pv
 where wn.node_id = pv.node_id)

Я предлагаю проверить наличие индекса в поле node_id в таблице path_vectors.

0 голосов
/ 02 ноября 2010

Если я что-то не так понимаю, way_nodes - это отображение между путём и узлами, которые составляют этот путь.Вы должны иметь возможность просто запросить эту одну таблицу, чтобы найти все пути с данным узлом.

SELECT DISTINCT way_id FROM way_nodes WHERE node_id = XYZ;

Если вопрос не в том, как сделать это для всех узлов ...

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