0

如何使用 .Net 客户端动态创建节点及其属性?像这样的东西?

  Node node = new Node();
  node.AddProperty("Type", "Domain");

我不想在一个类中硬编码这个,即

  JsonProperty***("Bar")]***
  public string Foo { get; set; }

  var myNodeReference = client.Create(new MyNode { Foo = "bar" });
4

3 回答 3

2

在可在 Neo4j.org 下载页面下载的 Neo4j 服务器 v2.0 M06 版本中,您可以在 Cypher 查询中直接使用 JSON 到您的 Neo4j 服务器。

例子:

CREATE 
    (view0:event:view 
     { 
         key:'view0', 
         verb:'view', 
         past:'has viewed', 
         present:'is viewing', 
         future:'will view' 
      })-[:event]->d16

您可以从我的 GitHub 存储库中获取以下 C# 类文件,该文件允许您将 Cypher 查询直接发送到 Neo4j 服务器:

https://github.com/kbastani/predictive-autocomplete/blob/master/predictive-autocomplete/PredictiveAutocomplete/CypherQueryCreator.cs

您可以通过从 GitHub 转到以下 C# 类文件来查看其用法:

https://github.com/kbastani/predictive-autocomplete/blob/master/predictive-autocomplete/PredictiveAutocomplete/Processor.cs

转到“GetRankedNodesForQuery”,我在这里复制了代码。

public static List<IGraphNode> GetRankedNodesForQuery(string index, string luceneQuery, string relationshipLabel, string labelPropertyName, int skip, int limit)
{
        var sb = new StringBuilder();
        sb.AppendLine("START node=node:{0}(\"{1}\")");
        sb.AppendLine("WITH node");
        sb.AppendLine("SKIP {2}");
        sb.AppendLine("LIMIT {3}");
        sb.AppendLine("WITH node");
        sb.AppendLine("MATCH n-[{4}]->node");
        sb.AppendLine("WITH node, count(distinct n) as size");
        sb.AppendLine("RETURN node.{5}? as label, size");
        sb.AppendLine("ORDER BY id(node)");
        sb.AppendLine("LIMIT {3}");

        string commandQuery = sb.ToString();

        commandQuery = string.Format(commandQuery, index, luceneQuery, skip, limit, !string.IsNullOrEmpty(relationshipLabel) ? string.Format(":{0}", relationshipLabel) : string.Empty, labelPropertyName);

        GraphClient graphClient = GetNeo4jGraphClient();

        var cypher = new CypherFluentQueryCreator(graphClient, new CypherQueryCreator(commandQuery), new Uri(Configuration.GetDatabaseUri()));

        var resulttask = cypher.ExecuteGetCypherResults<GraphNode>();
        var graphNodeResults = resulttask.Result.ToList().Select(gn => (IGraphNode)gn).ToList();
        return graphNodeResults;
}

在其他版本中,您需要创建一个包装器。目前最简单的方法是升级到 2.0 版本。如果这对您不可行,请告诉我,我将编写 .NET C# 包装器。

于 2013-10-28T22:01:26.490 回答
0

您可以使用 Cypher.Net 创建动态节点和关系 http://www.nuget.org/packages/CypherNet/

(此处的文档和来源:https ://github.com/mtranter/CypherNet )

const string NEO_SERVER_URL = "http://localhost:7474/db/data/";
var sessionFactory = Fluently.Configure(NEO_SERVER_URL ).CreateSessionFactory();
var cypherSession = sessionFactory.Create();
var node = cypherSession.CreateNode(new { FirstName = "John", LastName = "Smith"});
dynamic dynamicNode = node;
dynamicNode.SomeProperty = "SomeValue";
dynamicNode.AnotherProperty = 123;
cypherSession.Save(node);
于 2013-11-12T08:43:31.657 回答
0

当我为 neo4j 尝试了几个可用的 .NET 客户端时,我发现它们都不适合我的用例。由于这些客户端只是REST API的包装器,因此直接通过 REST 与服务器通信要容易得多。HTTP 和 JSON 支持在 .NET 的当前状态下非常出色。

这样你就可以动态地构建你的节点并以你喜欢的方式创建它们(通过 REST 创建节点)。

于 2013-04-19T13:58:16.227 回答