използването на множество клаузи за съвпадение не връща никакъв резултат в neo4j cypher заявка

Изпълнявам следните две заявки и получавам някакъв резултат.

Първо запитване

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;

Тази заявка връща празен итератор.

Използвах „запетая“, за да комбинирам условията MATCH и „и“, за да комбинирам условията WHERE. Има ли някакъв проблем в това?

(Внедрявам създател на заявки, за да създам cypher заявка. Трябва да проверя множество съвпадения на условия. Какъв е най-добрият начин да направя това?)

Neo4j 1.9M04

person Syam Kumar S    schedule 17.05.2013    source източник
comment
Изглежда ми правилно. Сигурни ли сте, че има person, които отговарят и на двата критерия? Тоест, има ли някакви persons, които се появяват в резултата от заявка 1 и заявка 2?   -  person ean5533    schedule 18.05.2013
comment
Да, има хора, които отговарят и на двете условия.   -  person Syam Kumar S    schedule 18.05.2013
comment
Опитах се да изпълня заявката без клаузата WHERE и отпечатах резултата, включително всички 'var's, които използвам. var7, var8, var9, var10, var11 са null за всички резултати. var1 и var7 представляват възлите с релация „контакти“, но var1 има някои стойности, а var7 е нула.   -  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)


Възможно е да се сблъскате с условието „уникалност на идентификатора“, описано тук (вж. първа публикация от Michael Hunger). Ако имате съвпадение на същия (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