97

シェフが持っている可能性のある不足している材料を「見つける」サイファーを使用してクエリを作成しようとしています。私のグラフは次のように設定されています。

(ingredient_value)-[:is_part_of]->(ingredient)

(ingredient)name="dyecolors"のキー/値があります。 (ingredient_value)のキー/値はvalue="red"であり、「の一部」である可能性があります(ingredient, name="dye colors")

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)

このクエリを使用して、レシピに必要な実際の値ではなく、すべての値を取得していますが、各レシピに必要なすべての材料ではなく、シェフが持っていないものingredientsだけを返したいと思います。ingredients私は試した

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef

しかし、これは何も返しませんでした。

これはcypher/neo4jで実現できるものですか、それともすべての材料を返送して自分で分類することで最も適切に処理できるものですか?

ボーナス:また、サイファーを使用して、シェフが持つすべての値をレシピが必要とするすべての値に一致させる方法もあります。これまでのところ、aによって返されchef-[:has_value]->ingredient_value<-[:requires_value]-recipe、結果を自分で集計したすべての部分一致のみを返しました。

4

6 に答える 6

166

2013年1月10日更新:

Neo4j2.0リファレンスでこれに出くわしまし

オプションの関係を使用しないようにしてください。とりわけ、

次のように使用しないでください。

MATCH a-[r?:LOVES]->() WHERE r IS NULLそれらが存在しないことを確認するだけです。

代わりに、次のようにします。

MATCH a WHERE NOT (a)-[:LOVES]->()

関係が存在しないかどうかを確認するためのサイファーの使用:

...
MATCH source-[r?:someType]-target
WHERE r is null
RETURN source

?マークは関係をオプションにします。

また

neo4j 2では、次のことを行います。

...
OPTIONAL MATCH source-[r:someType]-target
WHERE r is null
RETURN source

これで、存在しない(null)関係を確認できます。

于 2013-01-10T09:09:41.337 に答える
20

関係のないノードをフェッチする場合

これは、関係が存在するかどうかを確認するための良いオプションです

MATCH (player)
    WHERE NOT(player)-[:played]->()
    RETURN player

これについて複数の条件を確認することもできます。「再生済み」または「未再生」の関係にないすべてのノードが返されます。

MATCH (player) 
 WHERE NOT (player)-[:played|notPlayed]->()
 RETURN player

リアルシップを持たないノードをフェッチする

MATCH (player) 
WHERE NOT (player)-[r]-()
RETURN player

着信/発信関係がないノードをチェックします。

于 2014-12-08T07:31:48.917 に答える
8

「条件付き除外」セマンティクスが必要な場合は、この方法で実現できます。

neo4j 2.2.1以降、OPTIONAL MATCH句を使用して、unmatched(NULL)ノードを除外できます。

WITHと句の間に句OPTIONAL MATCHを使用することも重要ですWHERE。これにより、最初の句WHEREはオプションの一致の条件を定義し、2番目の句WHEREはフィルターのように動作します。

2種類のノードがあると仮定します:PersonCommunication。電話で連絡したことはないが、他の方法で連絡した可能性のあるすべての人を取得したい場合は、次のクエリを実行します。

MATCH (p: Person) 
OPTIONAL MATCH p--(c: Communication) 
WHERE c.way = 'telephone'
WITH p, c 
WHERE c IS NULL 
RETURN p

一致パターンは、電話以外のコミュニケーションの場合、すべての人とそのコミュニケーションを一致させcます。NULL次に、filter(WHEREafter WITH)は、電話通信をフィルターで除外し、他のすべてを残します。

参照:

http://neo4j.com/docs/stable/query-optional-match.html#_introduction_3 http://java.dzone.com/articles/new-neo4j-optional

于 2015-05-08T13:25:03.263 に答える
2

最後のクエリは次のようになります。

START chef = node(..)
MATCH (chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
WHERE (ingredient)<-[:has_ingredient]-chef
RETURN ingredient

このパターン:(ingredient)<-[:has_ingredient*0..0]-chef

それが何も返さなかった理由です。*0..0関係の長さはゼロでなければならないことを意味します。つまり、材料とシェフは同じノードでなければならず、そうではありません。

于 2012-06-09T08:49:51.463 に答える
2

私はgremlinを使用してこのタスクを完了しました。やった

x=[]

g.idx('Chef')[[name:'chef1']].as('chef')
.out('has_ingredient').as('alreadyHas').aggregate(x).back('chef')
.out('has_value').as('values')
.in('requires_value').as('recipes')
.out('requires_ingredient').as('ingredients').except(x).path()

これにより、不足しているすべての材料の経路が返されました。少なくともバージョン1.7では、これを暗号言語で定式化することができませんでした。

于 2012-06-11T07:12:10.800 に答える
2

Cypher2.0を使用してこれを非常に自然に行う方法を示す要点を書きました

http://gist.neo4j.org/?9171581

重要なポイントは、利用可能な材料とのオプションの一致を使用してから、欠落している(null)材料または間違った値の材料をフィルターで比較することです。

この概念は宣言型であり、アルゴリズムを記述する必要はなく、必要なものを書き留めるだけであることに注意してください。

于 2014-02-23T14:13:40.967 に答える