2

私は最近、.NET統合にNeo4JClientを使い始めましたが、(最終的には)ほとんどのことを理解しました。しかし、これは私を困惑させました。

Cypherクエリから、できればPOCOオブジェクトでパスを取得して、これらのクエリのフロントエンドで作業できるようにすることに興味があります。

だから私の質問は本質的にNeo4JClientでこれをどのように行うのですか?そして、私ができない場合、他のNeo4J .NETクライアントのいずれかがこれをサポートしていますか?

サンプルのcypherクエリ:

start n = node:idx(id="{id}")

MATCH p=(n)-[:RELATED_TO*0..3]-()

RETURN p;

したがって、特定のノードの周囲にある、着信と発信の両方の関係が3の深さのすべてのノードが必要です。別のタイプのクエリもありますが、withsを使用しているため、Neo4JClientがそれをサポートするかどうか/どのようにサポートするかを確認する必要があります(別の質問があります) )。

これまで、私はオープンセットとクローズドセットでGremlinを使用して、カスタムオブジェクトにそのサブリレーションシップに関する情報を入力してきました。それは決して効率的ではないので、なぜ私はどういうわけかパスでそれをやりたいのです。問題のカスタムオブジェクトは次のようになります。

public class ConnectedNode : BaseNode
{
    public List<NodeRelation> RelatedNodes { get; set; }

    public ConnectedNode()
    {
        RelatedNodes = new List<NodeRelation>();
    }
}

public class NodeRelation
{
    // ... various properties for relationship payload type stuff
    public ConnectedNode RelatedNode { get; set; }
    public RelationshipDirection Direction { get; set; }
}

効率的である限り、探しているパス上のノードと関係データをプルバックするものは何でも満足しています。

4

3 に答える 3

1

やってみました:

ICypherFluentQueryReturned<PathsResult> query
    = graphClient.Cypher
                    .StartWithNodeIndexLookup("n", "idx", "id", id)
                    .Match("p=(n)-[:RELATED_TO*0..2]-()")
                    .Return<PathsResult>("p");
IEnumerable<PathsResult> res = query.Results;

の結果のそれぞれはresあなたが求めているものでなければなりませんか?

于 2013-02-27T12:18:28.003 に答える
1

私はこの問題に対する答えを考え出すことになり、このテーマに関するブログ投稿を書きました。しかし、あなたはそれの要点のために投稿を読む必要がないので...

まず、EXTRACT関数を使用して、パスのノードと関係を抽出します。これにより、2列の結果が得られます。この2列の結果を、ノードとRelationshipInstancesのリストを取得する独自に選択したPOCOに含めます。次に、プロジェクションを使用して、この種のオブジェクトにクエリを取得します。出来上がり!

これがお役に立てば幸いです、それは私を助けました。

于 2013-03-14T14:12:20.223 に答える
1

Chris Skardon のコード( http://geekswithblogs.net/cskardon/archive/2013/07/23/neo4jclient-ndash-getting-path-results.aspx ) から始めて、Relationship クラスを削除して、仕事。ノードのプロパティと関係 (TypeKey を含む) を一度に返すので、私は Chris のソリューションが気に入っています。新しいクラスを作成する必要がないことがわかりました。

    var queryResults = graphClient.Cypher
                .Match("p=(n)-[:RELATED_TO|OTHER_RELATION*0..2]-()")
                .Return(p => new 
                {
                    Nodes = Return.As<IEnumerable<Node<**YOUR_NODE_CLASS**>>>("nodes(p)"),
                    Relationships = Return.As<IEnumerable<RelationshipInstance<Dictionary<string,string>>>>("rels(p)")
                })
                .Results; 
       resultsPath.Dump();//Use LINQPad to see the results

私が使用したリレーションシップ オブジェクトはDictionary<string,string>( の代わりに使用できます**YOUR_NODE_CLASS**) です。私にとっては、フィールドにデータはありませんがRelationshipReference.Data、リレーションシップにプロパティがあればあると思います。

于 2016-01-05T22:54:05.153 に答える