提问者:小点点

“继承”术语的Neo4J密码查询


使用neo4j v2.1.7的社区版,我正在创建节点来表示许可证。

每个许可证都有条款,并且可以从另一个许可证“继承”条款。许可证本地的条款在继承的许可证中隐藏相同的条款。

我正在尝试编写一个将匹配本地和继承术语的密码查询。

这更容易用一些代码来演示。

我创建一个继承自另一个许可证的许可证:

create 
(l1:License)-[:inherits]->(l2:License),
(l1)-[:term]->(:Foo{value:"A"}),
(l1)-[:term]->(:Lar{value:"C"}),
(l2)-[:term]->(:Lar{value:"D"}),
(l2)-[:term]->(:Bar{value:"B"})

我想要一个查询,该查询将查找具有或继承以下术语的许可证:Foo=A,Bar=B,Lar=C

所以l1会匹配,因为它具有正确的Lar和Foo值,并继承具有正确值的Bar。

L2不匹配,因为它没有正确的Lar,并且缺少Foo。

我尝试了以下方法,但似乎很麻烦,至少有两个问题:

>

  • 我添加了“可选匹配(l1)-[:继承]-

    如何测试属性是否在范围内?换句话说,如果License的属性是像“20150101”这样的日期,并且我想测试20140101和20140101之间的值怎么办?由于我的“在哪里”正在测试路径的存在,我不知道如何测试一个属性是否大于或小于另一个值。

    不正确的密码查询:

    match (l1:License)
    optional match (l1)-[:inherits]->(l2:License)
    where 
    ( 
       (l1)-[:term]->(:Foo{value:"A"}) OR 
       (
           not((l1)-[:term]->(:Foo{value:"A"}))
           and
           (l2)-[:term]->(:Foo{value:"A"})
       )
    )
    AND
    (
       (l1)-[:term]->(:Bar{value:"B"}) or 
       (   
          not((l1)-[:term]->(:Bar{value:"B"}))
          and 
          (l2)-[:term]->(:Bar{value:"B"})
        )
    )
    AND
    (
       (l1)-[:term]->(:Lar{value:"C"}) or 
       (
          not((l1)-[:term]->(:Lar{value:"C"})) and
          (l2)-[:term]->(:Lar{value:"C"})
       )
    )
    return count(l1)
    

    提前感谢!


  • 共1个答案

    匿名用户

    我认为您仍然在关系方面想得太多,您的查询看起来像很多连接。

    我想这样就足够了。

    // find the 3 terms
    MATCH (t1:Foo {value:"A"}),(t2:Bar {value:"B"}), (t3:Lar {value:"C"})
    UNWIND [t1,t2,t3] as term
    // use them as starting point
    MATCH path = (l:License)-[:INHERITS*0..]->(l2)-[:TERM]->(term)
    RETURN l,l2,term, path