请在下面找到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],我将如何获取关系的属性。
答案 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>
,因为对通用部分有约束。