简短版本:我需要获取可以在不同方向上包含不同关系的路径。但是,我对自己的路径有限制,如果它包含特定类型的连续关系,那么两种关系都必须朝着相同的方向。
长版本:我正在使用下面的查询来获取两个节点之间的路径:
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
的另一个节点。下面的查询是一个特定的查询,它编码我需要的路径并返回路径,即路径的存在。我需要使用ShortestPath使其更通用。
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
cypher可以使用吗?
如果要捕获在任一方向一致的路径(但必须两次调用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