Свържете възел с всички възли на подграф в cypher

Забавлявам се с Neo4j и трябва да знам как мога да намеря възли, които имат връзка с всеки от възлите на даден подграф.

Нека обясним това с пример:

(Имам около 15 000 възли в моята база данни)

Сега, предвид подграфа (c1:Thing),(c2:Thing),...(cn:Thing) искам да знам всички възли, които не са нито един от (c1),...,(cn), но те имат връзка с всеки възел на (c1),...,(cn)

С други думи, бих намерил Cj, където съществуват отношенията: (Cj)-[r1]-(c1) . . . (Cj)-[rn]-(cn)

И j не в {1, ...., n}

Вижте това изображение, за да видите пример

Така че по същество искам да СЪПРИЕМА възли като c6, тези, които са свързани с всеки от възлите на подграфа (възли в червено).

ЗАБЕЛЕЖКА: Даденият подграф може да има произволно количество възли (n е променлива).

Първата ми мисъл е:

MATCH (c1:Нещо)-[r1]-(предложи:Нещо), (c2:Нещо)-[r2]-(предложи:Нещо), .... ,(cn:Нещо)-[rn]-(предложи :Thing) WHERE c1.id=1 AND ..... AND cn.id=n AND NOT(suggest.id IN [1, ...., n]) RETURN c1, r1, ...... , cn, rn, предполагам;

Но това наистина е гадно, когато имаме "n", което е голямо число.

Можеш ли да ми помогнеш?

Благодаря и хубав ден!


person Federico Castro    schedule 29.07.2014    source източник


Отговори (1)


Това, което следва, е начин за справяне с вашия въпрос, като същевременно правите някои предположения относно вашето моделиране на данни.

Запитване, подобно на това, вероятно ще ви даде това, което искате:

MATCH p=(n:Thing)-[:RELATED_TO]->(n2), (suggest:Thing)
WHERE n <> n2 AND NOT suggest IN nodes(p) AND ALL (x IN nodes(p) WHERE (suggest)-[:RELATED_TO]->(x))
RETURN suggest

Сега това предполага, че подграфът от интерес (т.е. c1 до cn) е свързан със същата връзка. Разбира се, можете да дефинирате пътя/подграфа, както желаете, и още по-добре би било да знаете началната и крайната си точка, но може да имате или да не разполагате с тази информация. Освен това, ако правите пътеки/подграфи с много дължини, внимавайте да ги ограничите. Освен това, ако обмисляте пътеки/подграфи с много дължини, резултатите, които ще получите обратно, потенциално няма да са уникални.

Друго предположение е, че (suggest) има същата връзка с всеки възел на подграфа и е от същия тип като връзките във вашия подграф. Променете това, ако е необходимо.

Въпреки това, това трябва да е достатъчно, за да започнете и/или да мислите в правилната посока. Както винаги, начинът, по който моделирате данните си, е също толкова важен, колкото и начина, по който пишете заявките си, ако не и повече.

HTH

person BtySgtMajor    schedule 29.07.2014