"inherited" 个术语的 Neo4J 密码查询

Neo4J cypher query for "inherited" terms

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

每个许可都有条款,并且可以 "inherit" 来自另一个许可的条款。许可证的局部条款会影响继承许可证中的相同条款。

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

用一些代码更容易演示。

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

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. 我添加了 "optional match (l1)-[:inherits]->(l2:License)" 是因为我想匹配未继承其他许可条款的许可。但是,出于某种原因我不理解,可选匹配为我提供了图中的两个许可证节点。

  2. 如何测试 属性 是否在一个范围内?换句话说,如果许可证的 属性 日期类似于“20150101”,而我想测试 20140101 和 20140101 之间的值怎么办?由于我的 "where" 正在测试路径的存在性,我看不到如何测试 属性 是否大于或小于另一个值。

不正确的密码查询:

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)

提前致谢!

我觉得你还是把关系想的太多了,你的查询看起来像很多join。

我觉得这样就够了。

// 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