如何通过neo4jclient和cypher返回Relationship及其属性

时间:2014-08-18 00:58:28

标签: c# neo4j cypher neo4jclient

请在下面找到Cypher查询(这是正常的)

MATCH (a:`Entity`) - [r] - (b:`Entity`)
RETURN a , r , b

第一个问题: 如何在我的c#代码中将其翻译为neo4jClient。

第二个问题: Relation有多个属性。如何使用neo4Jclient访问它们?

实体具有Properties EntityName和DataSpaceName Relation具有Properties RelationType和RelationFrequency。

我用于获取节点详细信息的代码如下所示

var query1 = client
        .Cypher
        .Match("(a:`Entity`) - [r] - (b:`Entity`)") 
        .Where("a.DataSpace = b.DataSpace")
        .Return((a,b) => new {
            FromEntity = Return.As<string>("a.EntityName"),
            ToEntity=Return.As<string>("b.EntityName")
            }
        );

编辑:

我曾试图弄明白。以下工作。

var query1 = client
        .Cypher
        .Match("(a:`Entity`) - [r] - (b:`Entity`)") 
        .Where("a.DataSpace = b.DataSpace")
        .Return((a,b) => new {
            FromEntity = Return.As<string>("a.EntityName"),
            ToEntity=Return.As<string>("b.EntityName"),
            Relation=Return.As<string>("r.RelType"),

            }
        );

但是,如果关系是外卡,即[*]或[r * 1..3],我将如何获取关系的属性。

1 个答案:

答案 0 :(得分:4)

关系对象与节点对象相同,因此您可以以相同的方式获取它们。

你是如何实际设置元素的?什么是&#39;实体&#39;,假设你有一个类:

public class Entity {
    public string DataSpace { get; set; }
    public string EntityName { get; set; }
}

和一个关系对象:

public class RelationshipObj {
    public string RelType { get; set; }
}

你会以这样的方式返回:

var originalQuery = graphClient
    .Cypher
    .Match("(a:`Entity`)-[r]-(b:`Entity`)")
    .Where("a.DataSpace = b.DataSpace")
    .Return((a, b, r) => new
    {
        FromEntity = a.As<Entity>().EntityName,
        ToEntity = b.As<Entity>().EntityName,
        Relation = r.As<RelationshipObj>().RelType,
    });

在您拥有[r*1..3]的情况下,您最终会返回更复杂的查询,而不是返回枚举。所以你回归&#39;关系&#39;变为:

Relation = r.As<IEnumerable<RelationshipObj>>()

你不能再使用&#39; RelType&#39;属性来自以后不解析结果:

foreach (var result in results)
{
    foreach (var relationship in result.Relation)
    {
        Console.WriteLine(relationship.RelType);
    }
}

现在,您实际上已经问过如何应对通配符关系,显然您无法获得上述属性 - 因为您实际上并不了解您的要求。您可以将结果作为string获取,并使用JSON.NET将其解析为正确的对象。但是,您也可以返回RelationshipInstance<Dictionary<string,string>>,它会为您提供TypeKey关系,您可以使用它来反序列化到关系对象中:

var query = graphClient.Cypher
    .Match("(a:`Entity`)-[r*]-(b:`Entity`)")
    .Where("a.DataSpace = b.DataSpace")
    .Return((a, b, r) => new
    {
        FromEntity = a.As<Entity>().EntityName,
        ToEntity = b.As<Entity>().EntityName,
        Relation = r.As<IEnumerable<RelationshipInstance<Dictionary<string,string>>>>(),
    });

var results = query.Results.ToList();

foreach (var result in results)
{
    foreach (var relationship in result.Relation)
    {
        if (relationship.TypeKey == "REL_TO")
        {
            var obj = JsonConvert.DeserializeObject<RelationshipObj>(JsonConvert.SerializeObject(relationship.Data));
            Console.WriteLine(obj.RelType);
        }
    }
}

我们必须做一些奇怪的反序列化/序列化事情,因为我们不能使用RelationshipObject<string>,因为对通用部分有约束。