2013-05-27 2 views
0

Я новичок в neo4j и буду очень благодарен за вашу помощь в этом.Запрос Cypher для проверки возможности подключения узла

У меня есть следующий график, созданный в neo4j.

n1 ---- ---- п2 п3 ---- n4 --- N5

n1, n2, n3, n4, n5 все узлы являются ---: relationship_type_1 (REL)

Теперь, учитывая любой набор узлов (в любом порядке), я хочу проверить, связаны ли эти узлы или нет. . С учетом n1, n2, n3 ==> Подключено. Данные n1, n3, n2, n4, n5 ==> Подключено.

Как я могу сформулировать свой запрос cypher для проверки возможности подключения?

После запроса работает, даже если изменить порядок,

MATCH p=_1--_2--_3 
WHERE _1.name?="Node1" and ALL (n in nodes(p) 
    WHERE n.name IN ["Node1", "Node2", "Node4"]) 
RETURN nodes(p); 

на http://console.neo4j.org/?id=xl8pnl

, но если я обеспечиваю начальные узлы вместо использования _1, _2 и изменить порядок, то он не возвращает меня в дорожка. :(

http://console.neo4j.org/?id=xl8pnl для следующего запроса,

START p1=node(6),p2=node(5),p3=node(4) MATCH p=p1--p2--p3 
WHERE p1.name?="Node1" AND ALL (n IN nodes(p) WHERE n.name IN ['Node1' ,'Node3', 'Node2' , 'Node4']) 
RETURN nodes(p) 

он не возвращает путь, как узлы соединены в узле (6) -node (5) -node (4) порядка.

+0

ли узлы должны быть подключены непосредственно или узлы между допустимым (найденный путь может быть больше, чем набор узлов, например n1, n3, n5 -> n1 ---- n2 ---- n3 ---- n4 --- n5 = connected)? –

+0

HI, Узлы должны быть подключены напрямую. . данный, n1, n3, n5 должен приводить к ==> Не связан. – sbhatt

ответ

2

Вы должны перечислить различные модели, которые составляют «связанность» к вам за мгновение, перечислив их в явном виде, как console.neo4j.org/r/2w3poz

START p1=node(0),p2=node(4),p3=node(5) 
RETURN 
    CASE 
    WHEN p1--p2--p3 OR p2--p1--p3 OR p1--p3--p2 OR p3--p2--p1 OR p3--p1--p2 
    THEN 'Connected' 
    ELSE 'Not connected' 
    END 
2

Случай 1:

2 пути найдено

MATCH p=_1--_2--_3--_4 
WHERE _1.name?="Node1" and 
    ALL (n in nodes(p) 
    WHERE n.name IN ["Node1", "Node2", "Node3", "Node4"]) 
RETURN nodes(p); 

Проверьте это здесь:

http://console.neo4j.org/?id=nn9yl6 в этом случае для того, независимо от того, dosen't


Case 2

(путь не найден)

использования узла 1,2,4

MATCH p=_1--_2--_3 
WHERE _1.name?="Node1" and ALL (n in nodes(p) 
    WHERE n.name IN ["Node1", "Node2", "Node4"]) 
RETURN nodes(p); 

Посмотрите здесь:

http://console.neo4j.org/?id=xl8pnl

+0

Просто небольшой быстрый вопрос. Возвращаются ли эти узлы каждый раз? , например. MATCH p = _1 --_ 2 --_ 3 --_ 4 WHERE _1.name?="Node1 "и ВСЕ (n в узлах (p) WHERE n.name IN [" Node1 "," Node2 "," Node3 "," Node4 "]) RETURN узлы (p); [(6: Node {name: "Node1"}), (5: Node {name: "Node2"}), (4: Node {name: "Node3"}), (3: Node { name: "Node4"}) будет ли он возвращать узлы в этом порядке каждый раз? (в порядке их подключения) – sbhatt

+0

Они будут поступать в порядке 'p', поэтому каждый раз по пути. – p3rnilla

+0

Это замечательно! Спасибо! :-) – sbhatt

Смежные вопросы