2016-06-28 5 views
3

人を表すノードがある大きなグラフがあります。それらはすべてfirstnameとsurnameのプロパティを持ち、いくつかはmiddlenameプロパティを持っています。私は同じ人を表す可能性のあるノードを探しているので、異なる名前の順列を見ています。私は現在、姓と最初の頭文字の頭文字を比較しています(いくつかのノードには頭文字があるだけです)がある場合、中札のテスト方法を理解することはできません。Neo4j Cypher - 存在する場合はプロパティ値を比較しますか?

私の現在のクエリは次のとおりです。

match (a:Author), (b:Author) 
where 
    a.surname=b.surname and 
    (a.firstname starts with 'A' and b.firstname starts with 'A') 
return distinct a,b 

私の理解ではOPTIONAL MATCHは、パターンのみを指していることなので、それは動作しません。私は理にかなっているif文を書く方法を見つけることができません。

それはそれは私ではなく、直接サイファークエリにだけ頼るより、プログラムでこれを行うために、より理にかなっていることかもしれないが、私は本当にそれをシンプルに保つだけサイファーでそれを行うには期待していました。

私がしたいことを明確にするための例です。

例1:

Node 1: firstname "John" middlename "Patrick" lastname "Smith" 
    Node 2: firstname "J" middlename "P" lastname "Smith" 
    Node 3: firstname "J" middlename "Q" lastname "Smith" 
    Node 4: firstname "J" lastname "Smith" 

I 'がマッチング' としてノード1,2、および4が返されたクエリをしたいです。

例2: '標準的な' 名前がミドルネームを持っていないので、ここで

Node 1: firstname "Jane" lastname "Smith" 
Node 2: firstname "J" middlename "P" lastname "Smith" 
Node 3: firstname "J" middlename "Q" lastname "Smith" 
Node 4: firstname "J" lastname "Smith" 

は、私は、すべての4つのノードをしたいです。私はあなたが以下のようなものが必要だと思う

+0

あなたがより明確に、それはあなたが「ミドルネームをテストする方法を見つけ出すことはできませんので、やろうとしているが何であるかを明らかにすることをお勧めしますもし存在するならば、あなたに「存在」を使ってダウン投票してもらうように言われました。 – joslinm

+0

ありがとう、うまくいけば、私の拡張された例がより明確になります。 FWIW、私はあなたにdownvoteしなかった。私にとって、あなたのコメントは、私が解決しようとしていた問題を明確に説明していない兆候でした。 – betseyb

答えて

2

match (a:Author), (b:Author) 
where 
    id(a) < id(b) and 
    (a.surname=b.surname) and 
    (a.firstname starts with 'A' and b.firstname starts with 'A') and 
    (a.middlename=b.middlename OR a.middlename IS NULL OR b.middlename IS NULL) 
return a,b 

How to work with nullは、あなたが扱っているようなパズルのために良いの参照です。

EDIT:のは、いくつかの擬似コードでそれを打破してみましょう:

if (a.middlename is null) return true; 
if (b.middlename is null) return true; 
if (a.middlename is not null and b.middlename is not null and a.middlename!=b.middlename) return false; 
if (a.middlename is not null and b.middlename is not null and a.middlename=b.middlename) return true; 
+0

これは正しい方法ではありません。 – joslinm

+0

その主張には理由がありますか?私は現時点でそれを自分でテストすることはできません。 – Sevle

+0

幾分理解できない要件について私が理解しているところから、OPはミドルネームを持つ人とミドルネームを持たない人を比較したいと考えています。あなたが追加した最後の節は、まったく同じミドルネーム(奇妙なもの)またはそれらの1つがゼロでない限り、基本的にすべての人にマッチします。 – joslinm

関連する問題