关于在何处使用标签与节点属性与关系+节点的任何经验法则.
让我们举个例子,说我有一个商店,我想把我的产品放在neo4j中.他们的标识符是产品sku,我也希望对它们进行分类,就像这个是衣服,食品,电子产品,你就明白了.我将在我的图表上进行免费搜索,就像用户可以搜索任何内容一样,并且我将返回与该搜索字符串相关的所有内容.
使用会更好吗:
sku 001,我会标记它的标签Food.sku 001,并在此节点上有属性调用category:"Food"sku 001,我将为其创建另一个节点Food,并将创建一个" category" 关系来关联它们.我已经读过,如果你要查找属性,最好将其作为关系+节点,因为遍历比查找节点属性要快得多.
TIA
我是新来的图形数据库现场,寻找到的Neo4j和学习暗号,我们试图图形数据库建模,这是一个相当简单的,我们得到了用户,我们得到了电影,用户可以查看完成 的电影,RATE 电影,创建播放列表和播放列表可以HAVE 电影.
问题是关于超级节点性能问题.我将从我正在阅读的一本非常好的书中引用一些东西 - 由Rik Van Bruggen学习Neo4j,所以这里是:
然后在数据集中出现一个非常有趣的问题,其中图的某些部分都连接到同一节点.此节点(也称为密集节点或超级节点)成为图遍历的真正问题,因为图数据库管理系统必须评估与该节点的所有连接关系,以确定下一步将在图遍历.
书中提出的这个问题的解决方案是让一个Meta节点与它有100个连接,第101个连接链接到一个链接到前一个Meta节点的新Meta节点.

我看过官方Neo4j博客的一篇博文,说明他们将在未来解决这个问题(博客文章是从2013年1月开始) - http://neo4j.com/blog/2013-whats-coming-next-在-的Neo4j /
他们更确切地说:
我们围绕"更大数据"计划的另一个项目是添加一些特定的优化来处理密集连接节点上的遍历,这些节点具有非常大(数百万)的关系.(这个问题有时被称为"超级节点"问题.)
您对此问题有何看法?我们应该使用Meta节点扇出模式还是使用每个教程似乎都使用的基本关系?还有其他建议吗?
TL; DR:我要么失去理智,要么neo4j的交易稍有破产.看起来未提交的节点在提交的事务之外可用,缺少属性 - 或者同样奇怪的东西.
我们的node.js应用程序使用neo4j.它的一部分必须生成唯一的ID.我们有以下cypher查询,用于查找最后一个:Id类型的节点并尝试使用提交新:Id节点last_uuid+1.
MATCH (i:Id) WITH i ORDER BY i.uuid DESC LIMIT 1 #with it like a sub-return, will "run" the rest with the last i at read-time
CREATE (n:Id {label:"Test"})
SET n.uuid = i.uuid + 1
RETURN n
Run Code Online (Sandbox Code Playgroud)
还有一个约束:
neo4j-sh (?)$ schema
Indexes
ON :Id(uuid) ONLINE (for uniqueness constraint)
Constraints
ON (id:Id) ASSERT id.uuid IS UNIQUE
Run Code Online (Sandbox Code Playgroud)
并初始化DB (:Id{uuid:1})以启动这种快乐.
应用程序代码基本上会重试上述查询,直到成功为止.如果两个或多个Id创建请求同时命中,其中只有一个将通过,其余的将失败并由应用程序代码重试.
这是有效的,直到我们并行尝试.
代码在没有uuid的情况下开始返回数据.经过大量的调查,结果是查询的写入部分(CREATE ...)以某种方式从MATCH接收:Id,没有.uuid(或其他)属性.这不应该是可能的.这是在这些节点上运行的唯一代码.
最奇怪的(也许)的事情是,如果我救i的nodeid,以找到在数据库节点,它确实存在,并有.uuid属性.
为了隔离这种行为,我编写了一个PoC: …
在我的应用程序中,为了更改节点的可见性,我定义了一个is_full_show参数,该参数采用true或false。我有一个updateNodeEntity()功能,可以在需要时更改其他参数值。以下是我的Cypher查询updateNodeEntity()功能的一部分:
"START n=node(" + nodeId + ") SET n.first_Name='" + neLabel + "', n.is_full_show=true, n.need_ne_update_approval=false";
Run Code Online (Sandbox Code Playgroud)
运行查询时,我可以看到参数已成功更改。但是,布尔值n.is_full_show=true变为字符串,n.is_full_show="true"并且我的节点未出现在我的应用程序中。有关更详细的描述,以下是来自控制台的请求有效负载:
ne_id:5306
ne_name:"Mike Mice"
ne_properties:"["email","address","first_Name","last_Name","membership","is_full_show","n.need_ne_update_approval"]"
ne_properties_val:"["mike@mikemail.com","123S Street","Mike","Mice","Silver",true,false]"
Run Code Online (Sandbox Code Playgroud)
和响应:
"properties": {
"Email": "mike@mikemail.com",
"Address": "123S Street",
"first_Name": "Mike",
"Last_Name": "Mice",
"Membership": "Silver",
"is_full_show": "true",
"n.need_ne_update_approval":"false"
}
Run Code Online (Sandbox Code Playgroud)
我尝试了许多选项,例如return true使用函数,正则表达式等。但是无法解决。任何帮助/建议将不胜感激。谢谢。
我正在使用node-neo4j npm模块,并使用db.cypherquery()调用从我的节点js应用程序调用cypher查询.我试图删除两个节点之间的关系,我想检测删除是成功还是失败.
请参阅下面的代码段:
var cypherQuery = "MATCH (u1:User {id: '10'})-[r:LIKES]->(u2:User {id: '20'}) DELETE r;";
db.cypherQuery(cypherQuery, function(err, result){
if(err) throw err; //does err indicate that delete failed, or something else (such as a syntax error in the cypher query)?
//do something based on whether delete succeeded or failed here
});
Run Code Online (Sandbox Code Playgroud)
因此,在上面,检测案例的最佳方法是什么,如下所示:1)没有找到匹配关系,因此没有删除任何内容2)找到关系并成功删除3)发现关系但有一些删除它时的其他错误4)cypher脚本中存在语法错误(我认为这是通过err值检测到的)
我使用嵌入式图形数据库作为Java应用程序的一部分.假设我执行某种类型的密码查询,并返回包含节点集合的ExecutionResult.
可以假设这些节点形成连接图.
这些节点中的每一个都有一些关系,我可以使用node.getRelationships(Direction.OUTGOING)来访问这些关系.我的问题是,如果其中一个关系的目标已经出现在执行结果中(即关系是查询模板的一部分),它是否保证Relationship.getEndPoint == Node X.
我想我真正要问的是,当Neo4j中的事务返回一个节点时,它只返回一个对象,并且不同的查询将继续返回对该一个对象的引用,或者它是否继续生成碰巧的新对象请参考相同的数据点?由于Node没有覆盖equalsTo方法,我一直在假设前者,但我希望有人可以告诉我.
我正在用java编写neo4j演示代码.以下是我正在创建节点,索引它们并打印其属性的代码的一部分.
String NODE_KEY = "UserID";
String NODE_PROPERTIES = "UserProperties";
createAndIndexUser(String userID){
Node node = graphDB.createNode();
node.setProperty(NODE_KEY, nodeID);
neo4jGraph.nodeIndex.add(node, NODE_KEY, userID);
return node;
}
for(int i=0 ; i<100 ; i++){
String userID = "userID_"+i;
Node node = createAndIndexUser(userID);
node.setProperty(NODE_PROPERTIES, strNodeProperties);
}
Iterable<Node> allNodes = GlobalGraphOperations.at(graphDB).getAllNodes();
for(Node n: allNodes){
System.out.println("n.getPropertyKeys: "+n.getPropertyKeys());
System.out.println(n.getProperty(NODE_KEY));
}
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时,第一个println的输出是:
n.getPropertyKeys: []
Run Code Online (Sandbox Code Playgroud)
而对于第二次打印,我收到一个错误:
Exception in thread "main" org.neo4j.graphdb.NotFoundException: 'UserID' property not found for NodeImpl#0.
Run Code Online (Sandbox Code Playgroud)
在哪里以及我做错了什么?为什么不打印所有属性键n.getProperty(NODE_KEY)?
是否还有其他方法可以获取所有节点并打印其属性?
neo4j ×7
node-neo4j ×7
cypher ×4
java ×1
javascript ×1
modeling ×1
performance ×1
transactions ×1