簡體   English   中英

Neo4J密碼查詢“繼承的”術語

[英]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。

我嘗試了以下操作,但看起來很麻煩,並且至少有兩個問題:

  1. 我添加了“可選匹配項(l1)-[:inherits]->(l2:License)”,因為我想匹配不繼承其他許可條款的許可。 但是,由於某些原因我不滿意,可選匹配為我提供了圖中的兩個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)

提前致謝!

我認為您在關系方面仍然考慮過多,您的查詢看起來像很多聯接。

我認為這樣就足夠了。

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM