У меня есть items
graph db. каждый item
подключен к нескольким properties
, которые могут совместно использоваться несколькими items
. Я добавляю узел search
, который определяется несколькими properties
.neo4j улучшение cypher запрос performace
Так что я (search_node) подключен к нескольким (properties_nodes) подключен к нескольким (items_nodes)
Теперь я хотел бы получить список элементов, которые отвечают на этот поиск, {х} свойств или больше. Упорядочено по количеству подходящих свойств.
start se=node:node_auto_index(name = {name}), pr = node:node_auto_index(type="item_property")
MATCH p=(se) -[rt:SEARCH]- > (pr)<-[r]-(item)
WHERE Has(item.type) and (item.type = "item")
WITH item, collect(distinct pr.name) as rs
where length(rs) > {x}
RETURN item.name as item_name, length(rs) as matching_properties
ORDER BY matching_properties desc
Проблема производительности для меня является то, что он будет искать для всех соответствующих элементов, даже те, которые соответствуют только один собственности, а затем удалить все элементы, которые меньше, чем соответствующие {х}. Если {x} больше 1, это большая трата.
Как я могу «СОХРАНИТЬ» только по {x} свойствам соответствия?
Создано образец соответствия: http://console.neo4j.org/?id=adrgsh
(Neo4j версия 1.9.2)
На данный момент я тестирую на наборе 5000 пунктов. для некоторых «поисков» у меня может быть 500 ответов на одно свойство, но только 50, отвечающих на 2 свойства или больше. Эта статистика вреда для меня. Если я масштабирую его, у него будет плохая производительность, потому что обычно мне нужно больше одного подходящего свойства. – skme
Согласен с Луанной, вы можете проверить предложение предложения Luannes на достаточно большом наборе данных и посмотреть, как он работает? –
Прямо сейчас, я запускаю экземпляр EC2 Micro, действительно «слабый». Поэтому даже запрос на 5000 наборе данных занимает от 3 до 4 секунд. Я использую neo4j для узла js для запроса DB ... – skme