neo4j - 连续关系方向的密码约束
问题描述
简短版本:我需要一条可以包含不同方向的不同关系的路径。但是,我对我的路径有一个限制,如果它包含特定类型的连续关系,那么这两个关系必须在同一个方向上。
长版:我正在使用下面的查询来获取两个节点之间的路径:
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)
or (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
这可能与 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
推荐阅读
- javascript - ChartsJS Annotations Plugin - 你能创建一个工具提示来伴随注释吗?
- r - 使用 tidyr 实现等效的 rbind
- android - 如何从 FirebaseMessagingService 执行 fullScreenIntent
- ruby-on-rails - rswag - 添加服务器的最佳实践
- android - Android App的用户数据不断增加:房间数据库
- java - springboot中的抽象类继承
- ios14 - 如何在 iOS 14 中使用 PHAuthorizationStatusLimited
- hangouts-chat - 谷歌聊天机器人自动扩展票证参考
- r - 在 R 中,如何将文件名列表读入单个数据帧?
- python - 创建 Python Tkinter 可执行文件。问题是在创建可执行文件后运行程序时,程序找不到依赖项