Почему я не могу запросить связанные узлы узла через Cypher, где существует связь?

Я пытаюсь запросить узлы через Cypher с определенным типом отношений.

Итак, есть два узла A (ID 1) и B (ID 2). Я использую Cypher Console в графическом интерфейсе администрирования.

Если я сделаю это: rel: 1

Я получаю результат двух отношений (идентификаторы 10 и 11) двух одинаковых узлов (идентификатор 3) (я знаю, что это плохо, но это данные). Если я посмотрю на отношения, там будет показано: Узел 1 Подобно Узлу 3 Узел 1 Подобно Узлу 3

Если я попробую это:

START n=node(*) MATCH n-[:SimilarTo]->b WHERE n.Name='A'

Получаю пустой результат !?

Итак, мой вопрос: почему я получаю этот пустой результат, хотя существуют две связи, которые имеют правильный начальный узел и правильные конечные узлы?

Я не понимаю этого.

Если у Вас есть предложения, пожалуйста, дайте мне знать ;)

Хорошо, я приведу другой пример ..

Я делаю следующий запрос:

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN artist.artistName, x.artistName, sim.artistName                             

И получим такой результат (правильный):

artist.artistName x.artistName sim.artistName
"Shining Fury"  "Dragonsfire"   "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Lorenguard"
"Shining Fury"  "Dragonsfire"   "Lorenguard"
"Shining Fury"  "Dragonsfire"   "Shining Fury"
"Shining Fury"  "Dragonsfire"   "Shining Fury"

Если я это сделаю:

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN artist.artistName, x.artistName, y.artistName, sim.artistName

Я получаю это (неверно):

artist.artistName x.artistName y.artistName   sim.artistName
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Dragonsfire"
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Ruffians"
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Dragonsfire"
"Shining Fury"  "Dragonsfire"   "Holy Cross"    "Ruffians"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Nightqueen"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Dragonsfire"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Holy Cross"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Nightqueen"
"Shining Fury"  "Dragonsfire"   "Lorenguard"    "Dragonsfire"

Это неверно, потому что мне не хватает исполнителя "Shining Fury" под именем y.artistName, как будто я получил его на предыдущем шаге. Не могу найти свою ошибку!

Другое редактирование ..

Запрос 1

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN ID(artist), ID(x), ID(sim)

результат:

ID(artist) ID(x) ID(sim)
210292  209410  228580
210292  209410  228580
210292  209410  212568
210292  209410  212568
210292  209410  210292
210292  209410  210292

Query2:

START artist=node:artists('artistMbid:*')
MATCH artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
RETURN ID(artist), ID(x), ID(y), ID(sim)

результат:

ID(artist) ID(x) ID(y) ID(sim)
210292  209410  228580  209410
210292  209410  228580  202357
210292  209410  228580  209410
210292  209410  228580  202357
210292  209410  212568  228580
210292  209410  212568  202279
210292  209410  212568  209410
210292  209410  212568  228580
210292  209410  212568  202279
210292  209410  212568  209410

person DoEasy    schedule 16.01.2013    source источник
comment
Вы уверены, что название отношений написано правильно? Дело имеет значение.   -  person Werner Kvalem Vesterås    schedule 16.01.2013
comment
Да, я уверен. Я сделал еще один пример, который использую практически ... Я пытаюсь запросить один тип отношений за несколько шагов. Первый и второй шаги верны, но третий шаг показывает мне неверное значение. Есть два узла, которые присутствуют на втором этапе, но отсутствуют на третьем этапе! Как такое могло произойти?   -  person DoEasy    schedule 16.01.2013
comment
Можете ли вы поделиться результатами этих двух запросов, включив идентификаторы узлов исполнителя, x, y и sim?   -  person Luanne    schedule 16.01.2013
comment
Да, конечно, я включаю их в пример ..   -  person DoEasy    schedule 16.01.2013
comment
Странно ... кажется, я тоже не могу понять, что это такое. Можно как-нибудь поделиться своей БД?   -  person Luanne    schedule 16.01.2013
comment
Да то же самое для меня, вначале я думал, что есть проблема из-за множественных отношений ... но другие связи, похоже, работают. Общий ресурс довольно сложен, размер БД составляет 1 ГБ, он состоит из 650 тыс. Узлов, отношений ~ 1Mill и свойств ~ 1Mill .. но если есть способ, которым я бы поделился, данные не являются конфиденциальными ..   -  person DoEasy    schedule 16.01.2013
comment
k, которым можно поделиться. Возможно, вы захотите опубликовать это в группе neo4j - кто-то там, скорее всего, сможет понять это. groups.google.com/group/neo4j   -  person Luanne    schedule 16.01.2013
comment
большое спасибо! Я постараюсь..   -  person DoEasy    schedule 16.01.2013
comment
работает здесь: console.neo4j.org/r/uybgoo   -  person Michael Hunger    schedule 16.01.2013
comment
удалите файлы журналов и заархивируйте базу данных, что должно немного снизить ее, вы также можете поделиться ссылкой в ​​частном порядке с Майклом на Neotechnology.com   -  person Michael Hunger    schedule 16.01.2013
comment
вы уверены, что ваше направление правильное?   -  person Michael Hunger    schedule 16.01.2013
comment
Я думал, что указываю направление, используя стрелку. Я имею в виду, что запрос с двумя шагами показывает результат, который должен быть частью запроса, который состоит из трех шагов. Таким образом, узел (ы) с ID 210292 все равно должен быть частью результат. Я прав?   -  person DoEasy    schedule 16.01.2013
comment
Вы можете столкнуться с предположением шифра, которое не назначает один и тот же узел двум разным идентификаторам во время сопоставления с шаблоном. Полезно для фильтрации совпадений первого уровня, которые вы не хотите иметь на втором уровне. Вы можете попытаться разбить предложение соответствия на два и использовать WITH между ними, чтобы разделить их.   -  person Michael Hunger    schedule 17.01.2013
comment
Я не уверен, правильно ли я понял, но я попробовал следующее: START artist = node: artist ('artistMbid: *') MATCH artist - [: SimilarTo] - ›x WITH x as level1 MATCH level1 - [: SimilarTo] -› y WITH y as level2 MATCH level2 - [: SimilarTo] - ›sim WHERE artist.artistName! = 'Shining Fury' ВЕРНУТЬ исполнителя, level1, level2, sim .... но получить сообщение об ошибке "Неизвестный идентификатор исполнителя".   -  person DoEasy    schedule 17.01.2013
comment
Первоначально я хотел сделать что-то вроде этого: START artist = node: artist ('artistMbid: *') MATCH artist - [: SimilarTo * 3] - ›simArtist WHERE artist.artistName = 'Shining Fury' RETURN artist.artistName, simArtist.artistName ... но когда я использовал это, я понял, что результат неверен ... Я сделал другие запросы (выполняя пошагово), потому что я хочу сделать вывод каждого шага, чтобы найти ошибку.   -  person DoEasy    schedule 17.01.2013
comment
Мне кажется, что начальный узел (Shining Fury) не добавляется в результирующий набор какого-либо шага (по какой-либо причине), хотя есть соединение от любого узла к начальному узлу снова (цикл) !? Могло ли это быть?   -  person DoEasy    schedule 17.01.2013
comment
Теперь я сжал БД и удалил журналы ... в результате у меня есть файл размером 55 МБ .. Майкл, если вы все еще заинтересованы в общей папке, теперь это возможно.   -  person DoEasy    schedule 17.01.2013


Ответы (1)


я не вижу там проблем:

artist-[:SimilarTo]->x-[:SimilarTo]->sim

дает вам идентификаторы artist и sim, где в некоторых случаях исполнитель = sim. в то время как

artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->sim

дает вам идентификаторы artist, x, y, sim, где y<>artist, потому что за ним следует sim -> я имею в виду, если вам будет предоставлен тот же идентификатор, что и в первом случае, то совпадение шифра приведет к бесконечному циклу, то есть 210292 209410 210292 209410 (я уверен, что " Shining Fury »имеет связь только с« DragonsFly », и поэтому просто не может быть другого идентификатора сима, кроме« DragonsFly ».

попробуйте добавить еще 1 идентификатор, и вы также увидите часть первого запроса, например:

artist-[:SimilarTo]->x-[:SimilarTo]->y-[:SimilarTo]->z-[:SimilarTo]->sim

даст вам imo 210292 209410 210292 209410 xxxxx

Я предлагаю быть на 100% уверенным, что вы получаете одни и те же узлы под идентификаторами, либо разделите запрос на 2 отдельные части (как предлагается в комментариях с WITH), либо строго определите, что вы не хотите никакого цикла в запросе:

MATCH artist-[:SimilarTo]->x-[:SimilarTo]->sim
WHERE artist.artistName! = 'Shining Fury' 
AND Id(artist)<>Id(sim)

в случае, если вам нужно пройти через циклы, выполните разделение запроса на 2 части.

person ulkas    schedule 17.01.2013
comment
Хорошо, вы правы ... художник Shining Fury имеет (только одну) связь с другим художником Dragonsfly .. из-за этого первый уровень прошел хорошо ... теперь у Drogonsfly есть несколько связей, в том числе одна с началом (Shining Fury), которые все правильно возвращаются на втором уровне ... выполняя третий шаг, узел (Shining Fury) больше не включается (как вы сказали, Cypher зациклился бы) .. но я не понимаю почему cypher попадет в бесконечный цикл, потому что максимальное количество шагов для совпадения определено. - person DoEasy; 17.01.2013
comment
Я понимаю, что в некоторых случаях я бы получил результат, который похож на 210292 209410 210292 209410 aso. ... и это было бы нормально, но я не понимаю бесконечный цикл - person DoEasy; 17.01.2013
comment
Следующий запрос Cypher работает и дает также 'цикл (ы)': START artist = node: artist ('artistMbid: 2190dd22-afad-43ee-8728-0bc00621f5ee') MATCH artist - [: SimilarTo] - ›x WITH artist, x как level1 MATCH level1 - [: SimilarTo] - ›y С исполнителем, level1, y как level2 MATCH level2 - [: SimilarTo] -› sim RETURN artist.artistName, level1.artistName, level2.artistName, sim.artistName - person DoEasy; 17.01.2013
comment
на самом деле термин бесконечный цикл не так уж и бесконечен, и я не могу объяснить его лучше, просто шифр никогда не должен проходить цикл 2 раза. a-b - это цикл, a-b-a - полтора цикла, а a-b-a-b - в 2 раза один и тот же цикл. на этом этапе вернем мое утверждение 210292 209410 210292 209410 xxxxx - это возможно тогда и только тогда, когда между этими узлами больше ребер, а не только один SimilarTo - person ulkas; 17.01.2013