2017-09-29 20 views
0

Neo4jでは、startNode(relationship), endNode(relationship)を使用して、関係のあるノードの開始点と終了点を指定します。Neo4jスカラー関数(C言語)#

私のサンプルクエリはこれです:

match p=(n1 {Identifier:<id>})-[:r1|r2*2]-(n2) unwind relationships(p) as rel return distinct startNode(rel) as n1, type(rel), endNode(rel) as n2 

ので、基本的にはその可変長の関係と私はタイプだけでなく、各関係の開始と終了ノードを取得することができます。

startNodeまたはendNodeを指定しないと、実際には互いに接続されていない余分なノードが得られます。

これはneo4jのcypherで完璧に動作しますが、C#でstartNodeとendNode(Scalar関数)を実行する方法がわかりません。現在

私はこれを持っている:

var data = client.Cypher.Match("(n1)") 
      .Where((Node n1) => n1.Identifier == identifier) 
      .OptionalMatch("p=(n1)-[:r1|r1*2"]-(n2)") 
      .Unwind("relationships(p)", "rel") 
      .ReturnDistinct((n1, rel, n2) => new 
      { 
       startNode = n1.As<Node<string>>(), 
       endNode = n2.As<Node<string>>(), 
       relationship = rel.As<RelationshipInstance<object>>() 
      }).Results; 

これがないstartNodeとエンドノードの機能を実行するので、私は実際にお互い

任意のアイデアに接続されていない余分なノード-関係を取得することですC#neo4jクライアントでstartNodeとendNode関数をどのように実現するのですか?あなたがNeo4jClientReturn.As部品を使用する必要が

答えて

1

、以下のクエリが(まあ、OptionalあなたC#バージョンで使用を含む)元のサイファーと一致します。

var query = client.Cypher.Match("(n1)") 
      .Where((Node n1) => n1.Identifier == identifier) 
      .OptionalMatch("p=(n1)-[:r1|r2*..2]->(n2)") 
      .Unwind("relationships(p)", "rel") 
      .ReturnDistinct((n1, rel, n2) => new 
      { 
       startNode = Return.As<Node<string>>("startNode(rel)"), 
       endNode = Return.As<Node<string>>("endNode(rel)"), 
       relationship = Return.As<string>("type(rel)") 
      }); 

Return.Asあなたが関数を呼び出すことができますあなたはしたい。

+0

私はこの回答を更新するのを忘れましたが、それはまさに私が3日前にしたことです。とにかくありがとうございます –

+0

私が追加したい別の質問があります。パラメータがneo4jクエリに組み込まれていないparamsでクエリをフォーマットする方法はありますか?すなわち、where節でParamsやNodeのプロパティを使ってやることができます。しかし、私はその表現で* 2の2番目にParamと一緒に使うことはできません。深いレベルのように、私はグラフを横断したい。私の唯一の解決策はstring.formatを使用することですが、これはinjeciton攻撃に対して脆弱です...? –

+0

これはNeoの制限ですが、パラメータはそこでは機能しません: - / –