2014-09-04 2 views
6

У меня есть следующие два типа узлов:Получить узлы, которые не имеют определенное отношение (Cypher/Neo4j)

c:City {name: 'blah'} 
s:Course {title: 'whatever', city: 'New York'} 

Цель создания этот:

(s)-[:offered_in]->(c) 

Я пытаюсь получить все курсы, которые НЕ привязаны к городам и не создают отношения к городу (город создается, если его не существует). Тем не менее, проблема в том, что мой набор данных составляет около 5 миллионов узлов, и любой запрос, который я делаю, отключается (если я не делаю с шагом 10k).

... у кого-нибудь есть совет?

EDIT:

Вот запрос на работу я бегу сейчас (что должно быть сделано в 10k куски (из миллионов), так как это занимает несколько минут, так как это создает город, если Безразлично. «т существует):

match (j:Job) 
where not has(j.merged) and has(j.city) 
WITH j 
LIMIT 10000 
MERGE (c:City {name: j.city}) 
WITH j, c 
MERGE (j)-[:in]->(c) 
SET j.merged = 1 
return count(j) 

(сейчас не знает, хороший способ, чтобы отфильтровать те уже совпавшие, поэтому пытается сделать это, помечая его с обычаем„слит“атрибут, который у меня уже есть индекс на)

+0

Вы можете поделиться тем, что вы в настоящее время ищете? – JohnMark13

+0

Я не думаю, что на это можно ответить без дополнительного контекста (и, сопоставив ваш вопрос с вашим обновлением, я предполагаю, что задание == и в == Предлагаемый_индекс). Вы работаете с существующими данными или это массовый импорт? Не могли бы вы немного рассказать о настройке системы? Вместо «слияния» вы можете использовать WHERE NOT (j) - [: in] ->(). – JohnMark13

+0

Вы видите таймаут через интерфейс браузера? –

ответ

2

500000 - это ярмарка f ew, и по вашему другому вопросу, который вы предположили, что 90% были без отношений, которые вы хотите создать здесь, так что это займет немного времени. Без больше знаний о вашей системе (спецификации, нео настройки, среда программирования), и когда вы работаете в этом (на старых данных или на вставке), это просто догадка на опрятнее решение:

MATCH (j:Job) 
WHERE NOT (j)-[:IN]->() AND HAS(j.city) 
MERGE (c:City {name: j.city}) 
MERGE (j)-[:IN]->(c) 
return count(j) 

Очевидно, что вы можете добавьте свои ограничения по мере необходимости.

+0

Это 5 000 000 узлов. по какой-то причине запрос, который у меня был (и этот), производит тонны повторяющихся городов ... Я отказался и просто написал сценарий python, чтобы сделать это вручную небольшими кусками. будет вечно, но, кажется, держит уникальность и делает то, что мне нужно. В связи с этим, я попытался сыграть с «СОЗДАТЬ УНИКАЛЬНЫЙ» (так как этот должен гарантировать уникальность частей), но он продолжал говорить мне «несвязанный шаблон» или что он не должен использоваться (или что-то в этом роде), поэтому так и не получилось работать. – Diaspar

+1

Какие индексы вы определили и использовали ли вы два оператора слияния, как указано выше? Единственное слияние ('MERGE (j) - [: IN] -> (c: City {name: j.city})') приведет к дублированию из-за непревзойденного несвязанного шаблона. Не могли бы вы уточнить свой вопрос с дополнительной информацией (что вы пробовали, и что не удалось), поскольку это должно быть вполне возможно! – JohnMark13

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