neo4j: не следит за отношениями до конца - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь представить конфигурацию сети с neo4j. Вот сценарий Cyper, который я использовал до сих пор:

 CREATE (router1:Router {name:'router1', defaultgw:'192.168.123.1'})
 CREATE (router2:Router {name:'router2', defaultgw:'172.31.39.1'})
 CREATE (gateway1:Gateway {name:'gateway1', ip:'192.168.123.1' })
 CREATE (network1:Network {name:'network1', cidr:'192.168.123.0/24'})
 CREATE (network2:Network {name:'network2', cidr:'10.23.47.0/24'})
 CREATE (network3:Network {name:'network3', cidr:'172.31.39.0/24'})
 CREATE (server10:Server {hostname:'server10', ip:'172.31.39.10'})
 CREATE (server1:Server {hostname:'server1', ip:'192.168.123.7'})
 CREATE (server2:Server {hostname:'server2', ip:'192.168.123.9'})
 CREATE (server3:Server {hostname:'server3', ip:'192.168.123.10', ip:'10.23.47.7'})
 CREATE (server4:Server {hostname:'server4', ip:'192.168.123.13'})
 CREATE (server5:Server {hostname:'server5', ip:'192.168.123.23'})
 CREATE (server6:Server {hostname:'server6', ip:'192.168.123.15', ip:'10.23.47.17'})
 CREATE
   (gateway1)-[:CONNECTED_TO {}]->(router1),
   (router2)-[:CONNECTED_TO {}]->(network3),
   (router1)-[:CONNECTED_TO {}]->(network1),
   (router1)-[:CONNECTED_TO {}]->(network2),
   (router1)-[:CONNECTED_TO {}]->(router2),
   (network1)-[:CONNECTED_TO {}]->(server1),
   (network1)-[:CONNECTED_TO {}]->(server2),
   (network1)-[:CONNECTED_TO {}]->(server3),
   (network2)-[:CONNECTED_TO {}]->(server3),
   (network1)-[:CONNECTED_TO {}]->(server4),
   (network1)-[:CONNECTED_TO {}]->(server5),
   (network1)-[:CONNECTED_TO {}]->(server6),
   (network2)-[:CONNECTED_TO {}]->(server6),
   (network3)-[:CONNECTED_TO {}]->(server10)
 WITH gateway1 AS g
   MATCH (g)-[:CONNECTED_TO]->(r)-[:CONNECTED_TO]->(n)-[:CONNECTED_TO]->(s) RETURN g,r,n,s
 ;

Однако в случае MATCH рендеринг не выполняется до тех пор, пока серверы для третьей сети не будут!

Servers related to network3 are not getting represented

Что не так с моим запросом и как его можно улучшить? Есть ли другой способ сделать этот запрос, то есть представить все узлы, имеющие отношения или нет с другими вместо только узлов, связанных с одним (здесь, gateway1) источником?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Как говорит @cybersam, серверы в сети 3 находятся в четырех шагах, потому что им нужно перейти к маршрутизаторам.

Альтернатива его решению, если вы знаете, что ищете :Server узлов с 3 по 4 прыжками, вы можете использовать запрос, подобный следующему.

...
WITH gateway1 AS g
MATCH p=(g)-[:CONNECTED_TO*3..4]->(:Server)
RETURN p
0 голосов
/ 29 июня 2018

Если вы запрашиваете запрос, чтобы получить все узлы в поддереве с корнем в gateway1, тогда ваш MATCH не будет работать, потому что он совпадает только с путями с точно 3 CONNECTED_TO отношениями. Путь к server10 требует 4 прыжка.

Чтобы вернуть полные пути с 1 или более CONNECTED_TO отношениями с корнем в gateway1, это должно сработать (предложение WHERE отфильтровывает пути, где x - неконечный узел):

...
WITH gateway1 AS g
MATCH p=(g)-[:CONNECTED_TO*]->(x)
WHERE NOT (x)-[:CONNECTED_TO]->()
RETURN p;

И, если вы также хотите иметь возможность вернуть только корневой узел шлюза, когда у него нет других узлов в его подграфе, вы можете изменить * на *0..:

...
WITH gateway1 AS g
MATCH p=(g)-[:CONNECTED_TO*0..]->(x)
WHERE NOT (x)-[:CONNECTED_TO]->()
RETURN p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...