Cypher ограничение на направление последовательных отношений - PullRequest
0 голосов
/ 09 мая 2019

короткая версия: Мне нужно найти путь, который может содержать разные отношения в разных направлениях.Однако у меня есть ограничение на моем пути, где, если он содержит последовательные отношения определенного типа, тогда оба отношения должны быть в одном направлении.

длинная версия : Я использую запрос ниже, чтобы получить путь между двумя узлами:

MATCH p=shortestPath((n:Class { code: '1' })-[r*]-(m:Class { code: '4'})) WHERE NONE(x IN NODES(p) WHERE 'Ontology' in labels(x)) return p

Запрос правильно возвращает мнекратчайший путь между двумя узлами.Однако мне нужно дополнительно ограничить этот запрос так, чтобы он возвращал только путь, в котором последовательные отношения определенного типа находятся в одном направлении.

Например, предположим, что отношение -a-> должно быть в одном направлении,он не должен возвращать (1)-a->(2)<-a-(3)-b->(4), но может возвращать (1)-a->(6)-a->(3)-b->(7)<-c-(5)<-d-(6)-e->(4) или (3)-b->(7)<-c-(4).

Приведенные выше примеры были просто упрощением моих реальных данных.В моем реальном случае использования мне нужно найти кратчайший путь между узлом с IRI http://elite.polito.it/ontologies/dogont.owl#Actuator и другим узлом с IRI http://elite.polito.it/ontologies/dogont.owl#StateValue.Запрос ниже - это конкретный запрос, который кодирует нужный мне путь и возвращает путь, то есть путь существует.Мне нужно сделать его более общим, используя кратчайший путь.

MATCH p=(n:Class {iri: 'http://elite.polito.it/ontologies/dogont.owl#Actuator'})-->(a:Class)<--(b:ObjectProperty{iri:'http://elite.polito.it/ontologies/dogont.owl#hasState'})-->(c:Class{iri:'http://elite.polito.it/ontologies/dogont.owl#State'})<--(d:Class{iri:'http://elite.polito.it/ontologies/dogont.owl#hasStateValue'})-->(e:Class{iri:'http://elite.polito.it/ontologies/dogont.owl#StateValue'}) return p

Возможно ли это с шифром?

1 Ответ

0 голосов
/ 09 мая 2019

Этот запрос должен работать, если вы хотите захватить пути, которые согласованы в любом направлении (но он должен вызвать shortestPath() дважды):

MATCH (n:Class {code: '1'}), (m:Class {iri: '4'})
OPTIONAL MATCH p1=shortestPath((n)-[*]->(m))
WHERE NONE(x IN NODES(p1) WHERE 'Ontology' in labels(x))
OPTIONAL MATCH p2=shortestPath((n)<-[*]-(m))
WHERE NONE(y IN NODES(p2) WHERE 'Ontology' in labels(y))
RETURN p1, p2

p1 и / или p2 будет null, если нет последовательно правой или левой траектории, соответственно.

Однако, если вы знаете, что вам нужно определенное направление (скажем, вправо), тогда это должно сработать:

MATCH p=shortestPath((:Class {code: '1'})-[*]->(:Class {iri: '4'}))
WHERE NONE(x IN NODES(p) WHERE 'Ontology' in labels(x))
RETURN p
...