использование нескольких предложений соответствия не возвращает никакого результата в шифрованном запросе neo4j

Я выполняю следующие два запроса и получаю некоторый результат.

Первый запрос

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON') 
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:items]->(var5)-[?:value]->(var6) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0002' and var5.`#nodeId` ='at0028' and var6.`value` =~'address.*' 
return distinct person;

Второй запрос

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON') 
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:value]->(var5) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0009' and var5.`value` =~'india.*' 
return distinct person;

Но когда я объединяю два запроса в один запрос, чтобы получить людей, которые соответствуют обоим этим условиям, он не работает.

комбинированный запрос

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON')  
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:items]->(var5)-[?:value]->(var6) , (person)-[?:contacts]->(var7)-[?:addresses]->(var8)-[?:details]->(var9)-[?:items]->(var10)-[?:value]->(var11) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0002' and var5.`#nodeId` ='at0028' and var6.`value` =~'address.*' and 
var8.`#nodeId` ='at0000' and var9.`#nodeId` ='at0001' and var10.`#nodeId` ='at0009' and var11.`value` =~'india.*' 
return distinct person;

Этот запрос возвращает пустой итератор.

Я использовал «запятую», чтобы объединить условия ПОИСКПОЗ, и «и», чтобы объединить условия ГДЕ. Есть ли в этом проблема?

(Я реализую построитель запросов для создания шифрованного запроса. Мне нужно проверить несколько совпадений условий. Как лучше всего это сделать?)

Neo4j 1.9M04

person Syam Kumar S    schedule 17.05.2013    source источник
comment
Мне кажется правильным. Вы уверены, что есть person, отвечающие обоим этим критериям? То есть есть ли person в результатах запросов 1 и 2?   -  person ean5533    schedule 18.05.2013
comment
Да, есть люди, которые соответствуют обоим условиям.   -  person Syam Kumar S    schedule 18.05.2013
comment
Я попытался выполнить запрос без предложения WHERE, и я напечатал результат, включая все «var», которые я использую. var7, var8, var9, var10, var11 равны нулю для всех результатов. var1 и var7 представляют узлы с отношением «контакты», но var1 имеет некоторые значения, а var7 имеет значение null.   -  person Syam Kumar S    schedule 18.05.2013
comment
Это совершенно странно. Я действительно не могу объяснить такое поведение, кроме предположения, что это ошибка (или что-то еще, чего я не вижу). Можете ли вы настроить некоторые примеры данных на console.neo4j.org?   -  person ean5533    schedule 18.05.2013
comment
Есть ли способ воссоздать это на console.neo4j.org и опубликовать ссылку здесь?   -  person Peter Neubauer    schedule 19.05.2013


Ответы (1)


Возможно, вы столкнулись с проблемой «уникальности идентификатора», описанной здесь (см. первый пост Майкла Хангера). Если вы получили совпадение на том же узле (person) и имеете оттуда только 1 отношение :contacts, то идентификатор var1 "использует" подключенный узел в этом совпадении, а var7 не может быть назначен тому же узлу.

Другими словами, узел, найденный оператором соответствия, может использоваться только одним идентификатором в одном и том же операторе match.

Вместо этого вы можете попробовать использовать предложение WITH, за которым следует еще одно MATCH, чтобы обойти эту проблему.

START 
person=node:NODE_TYPE(NODE_TYPE='PERSON') 
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:items]->(var5)-[?:value]->(var6) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0002' and var5.`#nodeId` ='at0028' and var6.`value` =~'address.*' 
with distinct person
MATCH 
(person)-[?:contacts]->(var1)-[?:addresses]->(var2)-[?:details]->(var3)-[?:items]->(var4)-[?:value]->(var5) 
WHERE 
var2.`#nodeId` ='at0000' and var3.`#nodeId` ='at0001' and var4.`#nodeId` ='at0009' and var5.`value` =~'india.*' 
return distinct person;
person bebbi    schedule 21.07.2013
comment
Спасибо за помощь. Но я изменил свой конструктор, чтобы идентификаторы использовались повторно, если они встречаются более одного раза. - person Syam Kumar S; 24.07.2013