首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“继承”术语的Neo4J密码查询

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

Stack Overflow用户
提问于 2015-03-14 13:11:43
回答 1查看 143关注 0票数 1

使用社区版的neo4j v2.1.7,我创建了代表许可证的节点。

每个许可证都有条款,并且可以从另一个许可证“继承”条款。许可证的本地术语与继承的许可中相同的术语相形见绌。

我正在尝试编写一个与本地和继承条件相匹配的密码查询。

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

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

代码语言:javascript
复制
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之间的值,该怎么办?因为我的"where“测试路径的存在,所以我不知道如何测试一个属性是否大于或小于另一个值。

不正确的密码查询:

代码语言:javascript
复制
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)

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-15 00:33:28

我认为您在关系术语上仍然想得太多,您的查询看起来像很多联接。

我想像这样的东西就足够了。

代码语言:javascript
复制
// 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29049321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档