Cypher для подключения совпадающих узлов на основе определенных отношений - PullRequest
0 голосов
/ 22 февраля 2019

Если я сделаю:

MATCH (x:NODE {x.name: "Node1"})-[r:REL1]-(y:NODE) return x,r,y

Как мне найти все отношения REL1 среди набора x и y узлов?

РЕДАКТИРОВАТЬ:

Основываясь на ответах, я думаю, что вопрос не ясен.

Пример графика:

create (:T1 {name:1}), (:T1 {name:2}), (:T1 {name:3}), (:T1 {name:4}), (:T1 {name:5}), (:T1 {name:6}), (:T1 {name:7})
match (a:T1 {name:1}), (b:T1 {name:2}) create (a)-[r:REL1]->(b)
match (a:T1 {name:1}), (b:T1 {name:3}) create (a)-[r:REL1]->(b)
match (a:T1 {name:5}), (b:T1 {name:4}) create (a)-[r:REL1]->(b)
match (a:T1 {name:5}), (b:T1 {name:3}) create (a)-[r:REL1]->(b)
match (a:T1 {name:5}), (b:T1 {name:2}) create (a)-[r:REL1]->(b)
match (a:T1 {name:5}), (b:T1 {name:1}) create (a)-[r:REL1]->(b)
match (a:T1 {name:7}), (b:T1 {name:6}) create (a)-[r:REL2]->(b)
match (a:T1 {name:7}), (b:T1 {name:5}) create (a)-[r:REL2]->(b)
match (a:T1 {name:7}), (b:T1 {name:4}) create (a)-[r:REL2]->(b)
match (a:T1 {name:7}), (b:T1 {name:3}) create (a)-[r:REL2]->(b)

Я собираюсь найти все, что имеет отношение REL1 сузел name:5.Я также хочу найти все REL1 отношения между возвращенными узлами.

Так что я должен получить

5->4
5->3
5->2
5->1
1->2
1->3

Но не

7->5
7->4
7->3

Поскольку это REL2 отношений.

Так что я думаю, что могу сделать это так:

match (a:T1 {name: 5})-[b:REL1]->(c:T1) return a,b,c
union match (a:T1)-[b:REL1]-(c:T1) return a,b,c

Но проблема в том, что график, с которым я работаю, действительно большой, так что это кажется довольно неэффективным,Я предпочел бы иметь возможность

  1. Выбрать набор узлов (все, что связано с 5)
  2. Найти все соединения среди этих узлов

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Мы правильно используем двунаправленный, чтобы найти связь в любом случае, но вы выбираете только одно отношение REL1, когда вы пытаетесь найти все отношения, удалите метку из отношения [], поэтому вы можете использовать нижезапрос и возврат *, он вернет все используемые переменные.

MATCH (x:NODE {x.name: "Node1"})-[r]-(y:NODE) return *
0 голосов
/ 25 февраля 2019

Чтобы получить все отдельные пары узлов, соединенные одним или несколькими отношениями REL1, просто сделайте это:

MATCH (a:T1)-[:REL1]->(c:T1)
RETURN DISTINCT a, c

Результат будет:

╒══════════╤══════════╕
│"a"       │"c"       │
╞══════════╪══════════╡
│{"name":1}│{"name":2}│
├──────────┼──────────┤
│{"name":1}│{"name":3}│
├──────────┼──────────┤
│{"name":5}│{"name":1}│
├──────────┼──────────┤
│{"name":5}│{"name":2}│
├──────────┼──────────┤
│{"name":5}│{"name":3}│
├──────────┼──────────┤
│{"name":5}│{"name":4}│
└──────────┴──────────┘

Если вы такжехотите отношения между каждой парой, вы можете сделать это:

MATCH (a:T1)-[r:REL1]->(c:T1)
RETURN a, c, COLLECT(r) AS rels
0 голосов
/ 22 февраля 2019

Если вам нужно выяснить все отношения REL1 среди множества узлов x и y, то удалите условие из узла x.

MATCH (x:NODE)-[r:REL1]-(y:User) return x,r,y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...