Neo4J cypher查询“继承”术语

时间:2015-03-14 13:11:44

标签: neo4j cypher

使用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。

我尝试了以下内容,但它看起来很麻烦,至少有两个问题:

  1. 我添加了"可选匹配(l1) - [:inherits] - >(l2:License)"因为我想匹配没有继承其他许可条款的许可证。但是,由于某些原因我不理解,可选匹配在图中为我提供了两个许可节点。

  2. 如何测试属性是否在范围内?换句话说,如果许可证的财产类似于" 20150101"我想测试20140101和20140101之间的值?因为我的"其中"正在测试路径的存在,我不知道如何测试属性是否大于或小于另一个值。

  3. cypher查询不正确:

    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 个答案:

答案 0 :(得分: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