2013-06-17 7 views
1

У меня довольно простой график. Он имеет только около 100 узлов и 400 отношений. Я пытаюсь запустить множество запросов cypher, которые ранжируют результаты, основанные на существовании определенных отношений. Однако даже с небольшой базой данных эти запросы выходят из строя. Может ли кто-нибудь идентифицировать проблему с моим запросом, который вызовет тайм-аут?Cypher Query Timeout для комплексного запроса с весами

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

START node=node(1) 
MATCH (node)-[a?:REQUIRES]-(thing0)-[?:RELATED]-(stuff) 
,(node)-[b?:REQUIRES]-(thing1)-[:RELATED]-(system1)-[:COMPOSITION]-(something1)-[?:VERSION]-(stuff) 
,(node)-[c?:REQUIRES]-(thing2)-[:RELATED]-(something2)-[?:VERSION]-(stuff) 
,(node)-[d?:REQUIRES]-(thing3)-[:REQUIRES]-(project1)-[:REQUIRES]-(thing6)-[?:RELATED]-(stuff) 
,(node)-[e?:REQUIRES]-(thing4)-[:DESCRIBES]-(part)-[:DESCRIBES]-(thing5)-[?:RELATED]-(stuff) 
WITH stuff 
, count(distinct a)*.15 as shareA 
, count(distinct b)*.35 as shareB 
, count(distinct c)*.25 as shareC 
, count(distinct d)*.10 as shareD 
, count(distinct e)*.15 as shareE 
WHERE has(stuff.__type__) 
AND stuff.__type__='full.namespace.to.stuff' 
SET stuff.weight = shareA + shareB + shareC + shareD + shareE 
RETURN DISTINCT stuff 
ORDER BY stuff.weight DESC 
+0

У меня нет времени для правильного ответа, но необязательный соединитель отношений часто является причиной медленности. Вы можете попробовать разделить его на 'WITH', поэтому вам не нужно использовать дополнительные отношения, если это возможно. Вы сделали «профиль», чтобы узнать, что вернется? –

+0

Я новичок в Neo4j. Можете объяснить, что вы подразумеваете под «сделанным профилем»? – Blaine

+0

Кроме того, я не уверен, что могу переписать запрос, используя «WITH». Каждый из шаблонов, которые я проверяю, на самом деле необязателен. Я считаю, что WITH ограничит набор результатов только включением узлов, соответствующих всем шаблонам. – Blaine

ответ

1

Я думаю, что вы хотите, чтобы вынуть УСТРОЙСТВА, и сделать это в несколько Cypher заявлений внутри одного запроса сЕРИЙНОГО или сделки.

START stuff=node(*) 
WHERE has(stuff.__type__) AND stuff.__type__='full.namespace.to.stuff' 
SET stuff.weight = 0.0; 

START node=node(1) 
MATCH (node)-[a:REQUIRES]-(thing)-[:RELATED]-(stuff) 
WHERE has(stuff.__type__) AND stuff.__type__='full.namespace.to.stuff' 
SET stuff.weight = stuff.weight + COUNT(DISTINCT a)*.15; 

START node=node(1) 
MATCH (node)-[b:REQUIRES]-(thing)-[:RELATED]-(system1)-[:COMPOSITION]-(something1)-[:VERSION]-(stuff) 
WHERE has(stuff.__type__) AND stuff.__type__='full.namespace.to.stuff' 
SET stuff.weight = stuff.weight + COUNT(DISTINCT b)*.35 

START node=node(1) 
MATCH (node)-[c:REQUIRES]-(thing2)-[:RELATED]-(something2)-[:VERSION]-(stuff) 
WHERE has(stuff.__type__) AND stuff.__type__='full.namespace.to.stuff' 
SET stuff.weight = stuff.weight + COUNT(DISTINCT c)*.25 

START node=node(1) 
MATCH (node)-[d:REQUIRES]-(thing3)-[:REQUIRES]-(project1)-[:REQUIRES]-(thing6)-[:RELATED]-(stuff) 
WHERE has(stuff.__type__) AND stuff.__type__='full.namespace.to.stuff' 
SET stuff.weight = stuff.weight + COUNT(DISTINCT d)*.10 

START node=node(1) 
MATCH (node)-[e:REQUIRES]-(thing4)-[:DESCRIBES]-(part)-[:DESCRIBES]-(thing5)-[:RELATED]-(stuff) 
WHERE has(stuff.__type__) AND stuff.__type__='full.namespace.to.stuff' 
SET stuff.weight = stuff.weight + COUNT(DISTINCT e)*.15 

START stuff=node(*) 
WHERE has(stuff.__type__) AND stuff.__type__='full.namespace.to.stuff' 
RETURN DISTINCT stuff 
ORDER BY stuff.weight DESC 

Вы можете связать все с помощью «С», но я думаю, что это делает его довольно грязным.

+0

Ваше решение должно работать. Тем не менее, я планировал изменить взвешенный подход, чтобы он не уменьшал вес узла. Это может вызвать проблемы с параллелизмом, если несколько пользователей выполняют похожие запросы. Я должен признать, что я удивлен, что cypher не может обрабатывать этот тип запроса. – Blaine

+0

Связывание этих запросов с помощью «WITH» также вызывает таймаут. Я стесняюсь разделить их все, потому что у меня есть десятки этих запросов, разработанных, что каждый работает параллельно. Как я упоминал выше, сохранение весов в узле вызовет проблемы. Эти запросы выполнялись с небольшим графиком. Я действительно не вижу значения в базе данных графа, если он не может обрабатывать сложные отношения. Реляционная база данных справилась бы с этим гораздо более эффективно. – Blaine

+0

Проблема в том, что ваши необязательные отношения взорвали запрос. Можете ли вы разместить где-нибудь zip-папку graph.db, чтобы мы могли играть с ней? –

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

  • Нет связанных вопросов^_^