2017-12-22 8 views
1

私はNeo4jを初めて使用しており、小さなサイトを開発中です。shortestPath関係が正しい方向を反映していません

ノードとノード間の関係を設定しました。ペアになったノードのほとんどは、私は相互リンクを作成しました。

Zeus - FATHER -> Apollo 
Appollo - SON -> Zeus 

私はこの二つの間の最短経路を見つけるためshortestPathを使用する:たとえば

MATCH (o1 { name: 'Apollo' }),(o2 { name: 'Zeus' }), p = shortestPath((o1)-[*..6]-(o2)) RETURN nodes(p), relationships(p) 

結果は、それが代わりに「SON」の「父」を返すことです。

クエリを[*..6]->(o2)に変更すると、 "SON"が返されます。

しかし、私は検索で、発信関係のないノードをo1にすることが考えられます。この場合、上記の変更されたクエリは失敗します。

ので:

  1. 元のクエリではありません、発信関係を持つノードに対処することができますが、間違った関係を返すことがあります。
  2. 変更されたクエリは正しい関係(これまでのところ)を返すことができますが、「関係なし」ノードに対処することはできません。

もちろん、問題2を修正するために少なくとも1つの発信関係を持つように変更することはできますが、余りにも冗長になります。

あなたのアドバイスを得ることを願っています。

答えて

1

特にバイジェクションの場合のように、双方向関係を作成することは悪い習慣です。

あなたは(それがZeusApolloの父であるならば、ApolloZeusの息子であることは明らかです)、データベース内のいくつかのデータを複製しています。

このクエリ:

MATCH 
    (o1 { name: 'Apollo' }), 
    (o2 { name: 'Zeus' }), 
    p = shortestPath((o1)-[*..6]-(o2)) 
RETURN nodes(p), relationships(p) 

検索のみ shortestpath。しかし、重複のために、実際には2つの最短パスがあります。 shortestpath機能をallshortestpathsに置き換えてすべてを見つけることができます。だからあなたはsonfatherの結果を持っています。

それとも、それは次のように行き来することができますthathます。また、shortestpath機能に関係タイプのリストを与えることができます。ご返信用

MATCH 
    (o1 { name: 'Apollo' }), 
    (o2 { name: 'Zeus' }), 
    p = shortestPath((o1)-[:FATHER*..6]-(o2)) 
RETURN nodes(p), relationships(p) 
+0

おかげではなく、Aはの父である場合ので、私はあなたのポイントに同意しませんでしたB、BはAのSONまたはDAUGHTERになります。または、AがBのSONである場合、BはAの父親または母親であり得る。この種の関係は一方向性に過ぎず、相互関係タイプを誘導することはできません。 – TaylorR

+0

rel型 'PARENT_OF'を持つことができ、各ノードには性別を指定できます。 – logisima

+0

これを行うことで、我々はNeo4jを妥協しています。 Neo4jが最も優れている「リンク」をすばやく真っ直ぐに検索するのではなく、追加のプロパティを検索する必要があります。私はそれが良いアイデアだとは思わない。 – TaylorR

関連する問題