سؤال

أرغب في تحديد النسبة المئوية لمدة المحادثة مع الجيران الذين يعرفون شخصًا معينًا.

على سبيل المثال، عند مراقبة العقدة A أولاً علينا معرفة مقدار الوقت الذي قضاه في التحدث مع جميع جيرانه والذي يتم تنفيذه بالاستعلام التالي:

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 12418           |
==> +-----------------+
==> 1 row, 0 ms

بعد ذلك علينا التحقق من أي من جيرانه يعرف شخصًا معينًا (على سبيل المثال ج) ونجمع فقط فترات المحادثات بين أ و ب حيث يعرف ب ج:

neo4j-sh (0)$ start a = node(351061) match (a)-[r:TALKED_TO]->(b)-[p:KNOWS]->(c) return sum(r.duration)
==> +-----------------+
==> | sum(r.duration) |
==> +-----------------+
==> | 21013           |
==> +-----------------+
==> 1 row, 0 ms

ما لا يبدو منطقيًا هنا هو أن المجموع الثاني أكبر من الأول بينما من المفترض أن يكون الثاني مجرد جزء من الأول.هل يعرف أحد ما يمكن أن يكون مشكلة للحصول على مثل هذه النتيجة؟الخطأ ظهر على 7 مستخدمين من أصل 15000.

هل كانت مفيدة؟

المحلول

أنت لا تنظر إلى شخص معين C في هذا الاستعلام.أنت تقوم بمطابقة جميع المسارات لأي علاقة KNOWS، لذا إذا كان لديك a->b->c وa->b->d، فسيتم حساب المدة بين a->b مرتين.

ما ربما عليك القيام به هو هذا بدلاً من ذلك:

start a = node(351061), c=node(xxxxx) // set c explicitly
match (a)-[r:TALKED_TO]->(b)
where b-[:KNOWS]->c // putting this in the where clause forces you to set C
return sum(r.duration)

إليك مثال في وحدة التحكم:http://console.neo4j.org/r/irm0zy

تذكر ذلك match يوسع و where يشدد النتائج.يمكنك أيضًا القيام بذلك باستخدام match, ، ولكن عليك تحديد c في start.

إحدى الطرق الجيدة لاختبار ما تفعله وظائفك المجمعة هي إرجاع كافة المتغيرات المسماة (أو تعيين مسار يمكنك إرجاعه) - وبهذه الطريقة ترى التجميع مفصولاً إلى إجماليات فرعية.مثل ذلك:

start a=node(1) 
match a-[r:TALKED_TO]->b-[:KNOWS]->c 
return sum(r.duration), a,b,c;
+-----------------------------------------------------------------------------------------------+
| sum(r.duration) | a                       | b                       | c                       |
+-----------------------------------------------------------------------------------------------+
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[4]{name:"person4"} |
| 20              | Node[1]{name:"person1"} | Node[2]{name:"person2"} | Node[3]{name:"person3"} |
| 20              | Node[1]{name:"person1"} | Node[5]{name:"person5"} | Node[6]{name:"person6"} |
+-----------------------------------------------------------------------------------------------+
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top