【问题标题】:Cypher constraint on direction of successive relationship连续关系方向的密码约束
【发布时间】:2019-05-08 22:11:16
【问题描述】:

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

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

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

这可以通过 cypher 实现吗?

【问题讨论】:

    标签: neo4j cypher path-finding


    【解决方案1】:

    如果您想捕获任一方向上一致的路径(但它必须调用 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
    

    【讨论】:

    • 不,这行不通,我在我的问题中添加了更多示例,基本上中介关系可以是任何方向
    • 好的,我想我明白你现在在说什么,但我相信你修改后的示例结果与你的查询不匹配。
    • 在修改后的结果中,-a-&gt; 不是必须的,但是如果连续有多个,它们必须在同一个方向
    • 我的意思是:您的查询在一端寻找1,在另一端寻找4,但您修改后的示例可以使用7 而不是4
    • 不,查询不起作用,我添加了另一个示例,其中包含有效的特定查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多