使用社区版的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。
我尝试了以下方法,但似乎很麻烦,至少有两个问题:
不正确的密码查询:
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)提前感谢!
发布于 2015-03-15 00:33:28
我认为您在关系术语上仍然想得太多,您的查询看起来像很多联接。
我想像这样的东西就足够了。
// 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, pathhttps://stackoverflow.com/questions/29049321
复制相似问题