Cypher 对连续关系方向的约束

Cypher constraint on direction of successive relationship

简略版: 我需要得到一条路径,可以包含不同方向的不同关系。但是,我对我的路径有一个约束,如果它包含特定类型的连续关系,那么这两个关系必须在同一方向上。

长版: 我正在使用下面的查询来获取两个节点之间的路径:

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

查询正确return给我两个节点之间的最短路径。但是,我需要进一步限制此查询,以便它 return 是特定类型的连续关系在同一方向的唯一路径。

例如,假设关系 -a-> 需要在同一个方向,它不应该 return (1)-a->(2)<-a-(3)-b->(4) 但可以 return (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 的节点。下面的查询是一个特定的查询,它对我需要的路径进行编码,它 return 是一条路径,即存在的路径。我需要使用最短路径使其更通用。

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

用密码可以吗?

如果您想捕获在任一方向上一致的路径(但它必须调用 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 and/or p2 如果没有一致的向右或向左路径,则分别为 null

但是,如果您知道自己想要一个特定的方向(例如,向右),那么这应该可行:

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