2014-01-05 5 views
1

У меня есть 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)

ответ

3

ИМХО, чтобы быть в состоянии соответствовать только элементы с> х свойств, вам все еще нужно, чтобы найти все те элементы, которые имеют свойства в общий с поисковым узлом. Опубликуйте, что вы можете отфильтровать совпадения с < x свойствами. Какие цифры вы получаете? В худшем случае, сколько элементов было сопоставлено и сколько было отброшено?

Вы можете упростить запрос (сочетаемые результаты на консоли, но может отсутствовать некоторые детали, которые не указаны в этом вопросе)

START se=node(11) 
MATCH (se)-[:SEARCH]- >(pr)<-[:HAS]-(item) 
WHERE HAS (item.type) AND (item.type = "item") 
WITH count(pr) AS matching_properties, item 
WHERE matching_properties>1 
RETURN item.name AS item_name, matching_properties 
ORDER BY matching_properties DESC 
+0

На данный момент я тестирую на наборе 5000 пунктов. для некоторых «поисков» у меня может быть 500 ответов на одно свойство, но только 50, отвечающих на 2 свойства или больше. Эта статистика вреда для меня. Если я масштабирую его, у него будет плохая производительность, потому что обычно мне нужно больше одного подходящего свойства. – skme

+0

Согласен с Луанной, вы можете проверить предложение предложения Luannes на достаточно большом наборе данных и посмотреть, как он работает? –

+0

Прямо сейчас, я запускаю экземпляр EC2 Micro, действительно «слабый». Поэтому даже запрос на 5000 наборе данных занимает от 3 до 4 секунд. Я использую neo4j для узла js для запроса DB ... – skme

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