[英]Neo4J cypher query for “inherited” terms
使用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)-[:inherits]->(l2:License)”,因為我想匹配不繼承其他許可條款的許可。 但是,由於某些原因我不滿意,可選匹配為我提供了圖中的兩個License節點。
如何測試屬性是否在范圍內? 換句話說,如果許可證的日期為“ 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)
提前致謝!
我認為您在關系方面仍然考慮過多,您的查詢看起來像很多聯接。
我認為這樣就足夠了。
// 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.